函数式接口就是只显式声明一个抽象方法的接口。为保证方法数量很少很多,java8提供了一个专用注解@FunctionalInterface
,这样,当接口中声明的抽象方法多于或少于一个时就会报错。以下图所示:
java
Lambda表达式本质上是一个匿名方法。让咱们来看下面这个例子:ide
public int add(int x, int y) { return x + y; }
转成Lambda表达式后是这个样子:函数
(int x, int y) -> x + y;
参数类型也能够省略,Java编译器会根据上下文推断出来:测试
(x, y) -> x + y; //返回两数之和
或者this
(x, y) -> { return x + y; } //显式指明返回值
可见Lambda表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。code
步骤:blog
@FunctionalInterface public interface InterfaceWithNoParam { void run(); }
public class TestJava8{ InterfaceWithNoParam param; }
public class TestJava8{ //匿名内部类 InterfaceWithNoParam param1 = new InterfaceWithNoParam() { @Override public void run() { System.out.println("经过匿名内部类实现run()"); } }; //Lambda表达式 //空括号表示无参 InterfaceWithNoParam param = () -> System.out.println("经过Lambda表达式实现run()") ; }
@Test public void testIntfaceWithNoparam() { this.param.run(); this.param1.run(); }
上述内容实现了无参无返回值的函数接口与实现,固然还有其余形式:接口
@FunctionalInterface public interface InterfaceWithParams { void run(String s); }
InterfaceWithParams params = new InterfaceWithParams() { @Override public void run(String s) { System.out.println("经过" + s + "实现run(String)"); } }; InterfaceWithParams params1 = (String s) -> System.out.println("经过" + s + "实现run(String)");
this.params.run("匿名类"); this.params1.run("Lambda");
@FunctionalInterface public interface InterfaceUnVoidWithNoParam { String run(); }
InterfaceUnVoidWithNoParam interfaceUnVoidWithNoParam = new InterfaceUnVoidWithNoParam() { @Override public String run() { return "Hello World!"; } }; InterfaceUnVoidWithNoParam interfaceUnVoidWithNoParam1 = () -> "Hello Lambda!";
String s = this.interfaceUnVoidWithNoParam.run(); System.out.println("返回结果是:"+s); String s0 = this.interfaceUnVoidWithNoParam1.run(); System.out.println("返回结果是:"+s0);
@FunctionalInterface public interface InterfaceUnVoidWithParams { String run(Integer integer); }
InterfaceUnVoidWithParams interfaceWithParams = new InterfaceUnVoidWithParams() { @Override public String run(Integer integer) { return String.valueOf(integer); } }; InterfaceUnVoidWithParams interfaceWithParams1 = (Integer integer) -> String.valueOf(integer);
String s1 = this.interfaceWithParams.run(1); System.out.println("您输入的是:"+s1); String s2 = this.interfaceWithParams1.run(2); System.out.println("您输入的是:"+s2);