Java 函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。


0x0. 例子

对于如下例子:

public class Animal {
    public static void run(float time) {
        System.out.println("running...");
    }
}
1
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

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

0x3. 简化成 Lambda 表达式

当然,匿名内部类还可以进一步简化成 Lambda 表达式,最终如下:

public class Test {
    public Test() {
        // 使用
        ((IAnimal) (time) -> System.out.println("dog is running...") ).run(10);
    }
}
1
2
3
4
5
6

匿名内部类转为 Lambda 表达式的格式:
((类型) (param1, param2, ...) -> { body }).调用方法()

最后更新: 4/29/2021, 3:13:59 PM