Lambda'特殊的void-compatibility rule' - 语句表达式

jar*_*sik 9 java lambda java-8

我正在阅读Java 8 in Action.在3.5.2节中,有一个关于'void-compatibility rule'的段落:

如果lambda有一个语句表达式作为它的主体,它与一个返回void的函数描述符兼容(前提是参数列表也是兼容的).例如,以下两行都是合法的,即使添加List的方法返回一个布尔值而不是消费者上下文中预期的void(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);
Run Code Online (Sandbox Code Playgroud)

你会如何描述'语句表达'?我以为这是陈述或表达.此虚空兼容性规则对我来说也不是100%清楚,你能想到其他任何例子吗?

Hol*_*ger 15

术语"语句表达式"或"表达式语句"指的是也允许用作语句的表达式.它们在Java语言规范,§14.8中描述.表达陈述.

他们包括

  • 方法调用
  • 分配
  • 递增/递减表达式
  • 类实例创建表达式

所以其他的例子是

Consumer<String> b = s -> counter++;
Function<String,Integer> f = s -> counter++;
Run Code Online (Sandbox Code Playgroud)

要么

Consumer<String> b = s -> new BigDecimal(s);
Function<String,BigDecimal> f = s -> new BigDecimal(s);
Run Code Online (Sandbox Code Playgroud)

根据经验,表格的lambda表达式x -> expression只对a Consumer(或void一般的函数类型)x -> { expression; }合法,如果合法的话.

  • @Deepak:你不明白哪一部分? (2认同)