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

时间:2017-01-05 10:27:27

标签: java lambda java-8

我正在阅读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%清楚,你能想到其他任何例子吗?

3 个答案:

答案 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 (前提是参数列表也兼容)的函数描述符兼容。

>