Java 函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
0x0. 例子
对于如下例子:
public class Animal {
public static void run(float time) {
System.out.println("running...");
}
}
1
2
3
4
5
2
3
4
5
正常情况下,直接使用Animal.run(10)
就可以。
0x1. 函数式接口
但如果想使用函数式方式,就要这样:
public interface IAnimal {
void run(float); // 有且仅有一个抽象方法
}
public class Dog {
public static void dogRun(float time) {
System.out.println("dog is running...");
}
}
public class Test {
public Test() {
// 使用
IAnimal willDo = Dog::dogRun; // 用方法引用方式进行调用
willDo.run(10);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0x2. 简化成匿名内部类
然而,对上述例子,我们可以不必专门定义Dog
这个类,可以使用匿名内部类进行简化:
public class Test {
public Test() {
// 使用
new IAnimal() {
public void run(float time) {
System.out.println("dog is running...");
}
}.run(10);
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
0x3. 简化成 Lambda 表达式
当然,匿名内部类还可以进一步简化成 Lambda 表达式,最终如下:
public class Test {
public Test() {
// 使用
((IAnimal) (time) -> System.out.println("dog is running...") ).run(10);
}
}
1
2
3
4
5
6
2
3
4
5
6
匿名内部类转为 Lambda 表达式的格式:
((类型) (param1, param2, ...) -> { body }).调用方法()
← Java 内部类