【发布时间】:2019-09-15 16:15:24
【问题描述】:
我不太明白的是为什么 java 编译器允许在消费者接口中使用 lambda 表达式,例如 s -> s.isEmpty()。
我已经为消费者接口尝试了一个像 s -> s.isEmpty() 这样的 lambda 表达式,它可以正常工作。其他一些 lambda 表达式不起作用,因为它们返回一些东西,例如 s -> s。
Consumer<String> cons1 = s -> s.isEmpty();
cons1.accept("abc");
编译和执行没有问题。
所以我遇到的问题是我认为像 s -> s.isEmpty() 这样的 lambda 表达式总是等价于 s -> {return s.isEmpty()};,所以我期待编译器给我一个错误,因为你不能返回 boolean(或任何其他type) 来自消费者接口。
显然,如果没有 return 语句,编译器会将 lambda 表达式转换为方法,并且方法 isEmpty() 只是被调用而没有实际返回值。
所以问题是什么时候将 return 添加到 lambda 表达式的主体中?这样我就可以知道编译器何时会给出编译器错误以及原因。
非常感谢,如果我解释得不够清楚,我很抱歉,我是新来的。
【问题讨论】:
-
你到底在问什么?使用
Consumer对象时会调用方法isEmpty()。但是,isEmpty()的返回值没有被使用,只是被忽略了。 -
这是因为方法调用表达式可以丢弃返回类型,如果这样可以使其与目标类型兼容。所以
s -> s.isEmpty()等于s -> { return s.isEmpty(); }或s -> { s.isEmpty(); return; } -
s.isEmpty()是一个声明,s不是。 -
如果不允许这样做,您也不能将
set.add用作消费者,因为这将忽略返回类型。您可以忽略返回类型。 -
你也可以
Consumer<String> cons1 = String::isEmpty;,但是没有加return关键字……accept方法的返回类型是void
标签: java lambda functional-interface