函数式接口就是只显式声明一个抽象方法的接口。为保证方法数量不多不少,java8提供了一个专用注解@FunctionalInterface
,这样,当接口中声明的抽象方法多于或少于一个时就会报错。如下图所示:
Lambda表达式
Lambda表达式本质上是一个匿名方法。让我们来看下面这个例子:
public int add(int x, int y) {
return x + y;
}
转成Lambda表达式后是这个样子:
(int x, int y) -> x + y;
参数类型也可以省略,Java编译器会根据上下文推断出来:
(x, y) -> x + y; //返回两数之和
或者
(x, y) -> { return x + y; } //显式指明返回值
可见Lambda表达式有三部分组成:参数列表,箭头(->),以及一个表达式或语句块。
Lambda表达式和函数式接口结合
步骤:
- 新建无参函数式接口(先演示无参);
- 新建包含属性为函数式接口的类;
- 实现函数式接口;
- 测试函数式接口的方法;
@FunctionalInterface
public interface InterfaceWithNoParam {
void run1();
}
//匿名内部类
InterfaceWithNoParam param1 = new InterfaceWithNoParam() {
@Override
public void run1() {
System.out.println("通过匿名内部类实现run()");
}
};
//Lambda表达式
//空括号表示无参
InterfaceWithNoParam param = () -> System.out.println("通过Lambda表达式实现run()") ;
@Test
public void testIntfaceWithNoparam() {
this.param.run1();
this.param1.run1();
}
其他形式的函数式接口及实现
上述内容实现了无参无返回值的函数接口与实现,当然还有其他形式:
- 有参无返回值
- 无参有返回值
- 有参有返回值
以下是我写的测试例子:
package lambda;
@FunctionalInterface
public interface InterfaceWithParams {
void run(String param);
}
package lambda;
@FunctionalInterface
public interface InterfaceWithNoParam {
void run1();
}
package lambda;
@FunctionalInterface
public interface InterfaceUnVoidWithParams {
String run(String param);
}
package lambda;
import org.junit.Test;
public class TestJava8 {
//匿名内部类
InterfaceWithNoParam param1 = new InterfaceWithNoParam() {
@Override
public void run1() {
System.out.println("通过匿名内部类实现run()");
}
};
//Lambda表达式
//空括号表示无参
InterfaceWithNoParam param = () -> System.out.println("通过Lambda表达式实现run()") ;
@Test
public void testIntfaceWithNoparam() {
this.param.run1();
this.param1.run1();
}
// lambda
InterfaceWithParams interfaceWithParams = (String param) -> System.out.println("lambda表达式有参无返回值," + param) ;
// 匿名内部类
InterfaceWithParams interfaceWithParams02 = new InterfaceWithParams() {
@Override
public void run(String param) {
System.out.println("匿名内部类表达式有参无返回值," + param);
}
};
@Test
public void testIInterfaceWithParam(){
interfaceWithParams02.run("匿名内部类");
interfaceWithParams.run("lambda");
}
// lambda 有参有返回值
// InterfaceUnVoidWithParams interfaceUnVoidWithParams = (String s) -> { return "您输入的是" + s; };
InterfaceUnVoidWithParams interfaceUnVoidWithParams = (String s) -> "您输入的是" + s;
InterfaceUnVoidWithParams interfaceUnVoidWithParams01 = new InterfaceUnVoidWithParams() {
@Override
public String run(String s) {
return "您输入的是" + s;
}
};
@Test
public void testInterfaceUnVoidWithParams(){
String a = interfaceUnVoidWithParams.run("lambda");
System.out.println(a);
String b = interfaceUnVoidWithParams01.run("匿名内部类");
System.out.println(b);
}
}