考虑以下代码片段:
Consumer<String> lambda1 = s -> {}; Function<String, String> lambda2 = s -> s; Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work! Function<String, String> lambda4 = LambdaTest::consume;
根据 Consumer 接口,它被定义为 void accept(T t);因此,当 Consumer 方法返回一个 String 时,人们可能会对 lambda3 的赋值感到困惑。令人惊讶的是,lambda4 也被赋值了。
这种场景归功于 Java 中方法引用的灵活设计。它允许以与直接调用方法相同的方式将方法适应功能接口。换句话说,可以调用任何返回值的方法并忽略返回值。
Lambda 表达式有两种形式:
表达式 s -> s 不兼容 void,因为 s 不是语句。然而,s-> s.toString() 可以是,因为方法调用是语句。
可用作语句的表达式(根据 Java 语言规范第 14.8 节)包括:
需要注意的是,形式 (arg) ->; methodReturningVoid(arg) 是 唯一 不兼容值的表达式形式。
以上是为什么带有返回值的 Java 方法引用可以与'Consumer”接口一起使用?的详细内容。更多信息请关注PHP中文网其他相关文章!