首先,值得一看的是什么
Consumer<String>。从文档中:
表示一个 接受单个输入参数且不返回结果的操作 。与大多数其他功能接口不同,消费者应该通过副作用来操作。
因此,它是一个接受字符串且不返回任何内容的函数。
Consumer<String> p = ""::equals;
成功编译,因为
equals可以使用String(以及实际上的任何Object)。equals的结果将被忽略。*
p = s -> "".equals(s);
这是完全相同的,但是语法不同。编译器知道不添加隐式内容,
return因为a
Consumer不应返回值。如果lambda是一个ough , 它将
添加一个隐式。
return``Function<String, Boolean>
p = s -> true;
这需要一个String(
s),但是由于
true是表达式而不是语句,因此无法以相同的方式忽略结果。编译器 必须
添加一个隐式的,
return因为表达式不能单独存在。因此,这 确实 有一个回报:一个布尔值。因此,它不是
Consumer。**
p = s -> ("".equals(s));同样,这是一个 表达式
,而不是一个语句。暂时忽略lambda,
System.out.println("Hello");如果将其用括号括起来,您将看到该行同样无法编译。*根据规格:
如果lambda的主体是语句表达式(即允许作为语句单独站立的表达式),则它与产生空隙的函数类型兼容;任何结果都将被简单丢弃。
**根据规格(感谢Eugene):
如果lambda主体是语句表达式(第14.8节)或与void兼容的块,则lambda表达式与[void-
production
]函数类型一致。



