lambda表达式与函数式接口

269 阅读1分钟

"Lambda 允许把函数作为一个方法的参数"这个说法不合理.

lambda表达式表示的是目标接口的实现类实体

Runnable r = () -> { System.out.println("这里是子线程");};

这里lambda表达式表示就是Runnable接口的匿名实现类, run方法打印了一条语句

目标接口指的是方法参数中要求传入的接口
Collections.sort(new ArrayList<>(), (o1, o2) -> 1);

此时的lambda表达式就是sort方法要求传入的Comparator接口的实现类实体

目标接口并没有直接指明是哪种类型, 所以如果存在如下的重载, 则不能使用lambda表达式
public void testFuntional(Interface1 interface1) {}
public void testFuntional(Interface2 interface2) {}

假如接口1和接口2都是函数式接口, 你在某处调用testFunctional方法, 想通过lambda表达式传参是不可行的, 因为编译器无法分辨lambda表达式到底是哪个接口的实现类.

综上所述:

①lambda表达式表示的是目标接口的实现类实体, 这个接口不一定要用@FunctionalInterface来修饰, 但是有且仅有一个抽象方法(重写的方法不算). 它存在的意义就是为了"简化只有一个抽象方法的接口的实现类书写方式", 你都只有一个抽象方法了, 那我把这个方法描述清楚了, 表达出来的意思不就清楚了吗?

②@FunctionalInterface注解的作用和@Override类似, 起到标识和语法约束的作用

如有错误, 欢迎交流指正