我正在阅读Java 8 in Action。在3.5.2节中,有一个关于'void-compatibility rule'的段落:
如果lambda有一个语句表达式,那么它是兼容的 使用返回void的函数描述符(提供参数 列表也兼容)。例如,以下两行都是 即使方法添加一个List返回一个布尔而不是 消费者上下文中预期的无效(T - > void):
// Predicate has a boolean return
Predicate<String> p = s -> list.add(s);
// Consumer has a void return
Consumer<String> b = s -> list.add(s);
您如何描述'语句表达'?我以为这是陈述或表达。此虚空兼容性规则对我来说也不是100%清楚,你能想到其他任何例子吗?
答案 0 :(得分:13)
术语“语句表达式”或“表达式语句”是指也允许用作语句的表达式。它们在Java语言规范§14.8. Expression Statements中描述。
它们包括:
所以其他例子是:
Consumer<String> b = s -> counter++;
Function<String,Integer> f = s -> counter++;
或
Consumer<String> b = s -> new BigDecimal(s);
Function<String,BigDecimal> f = s -> new BigDecimal(s);
根据经验,x -> expression
形式的lambda表达式仅对Consumer
(或一般的void
函数类型)合法,如果x -> { expression; }
将也是合法的。
答案 1 :(得分:0)
它在上一篇文章中得到了清楚的解释...我正在尝试!!!
可以为不返回任何值的lambda函数描述符提供具有显式返回值的函数描述符。
例如, 谓词T-> vs 消费者T->无效 可以为消费者提供接受输入并给出布尔值作为返回值的谓词lambda表达式。
在下面的示例中,public boolean add(E e){}返回boolean,但是它可以在用于Consumer的lambda中使用,它返回void。
Predicate<String> p = s -> list.add(s);
p.test("helloworld"); // this returns boolean
Consumer<String> consumerExample = s -> list.add(s);
consumerExample.accept("Welcometokpm"); // this returns void
答案 2 :(得分:0)
lambda表达式的常见结构是:
(parameter) -> {body};
带有单行语句 return 的{body} 是可选的,例如
Predicate<String> p = s -> list.add(s);
使用花括号时, return 语句成为强制性声明,例如
Predicate<String> p = s -> { return list.add(s);};
现在,考虑使用 Consumer 之类的功能接口,该接口具有不返回任何值的抽象方法。它可以接受返回任何值的语句,因为编译器会忽略此类抽象方法的 return 语句。
因此下面的语句成立:
Consumer<String> b = s -> list.add(s);
等同于:
Consumer<String> consumerExample = s -> {list.add(s);};
下一行不正确:
Consumer<String> consumerExample = s -> {return list.add(s);};
因此,如果lambda具有语句表达式作为其主体,则它与返回void (前提是参数列表也兼容)的函数描述符兼容。 。
>