栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

消费者为什么接受带有声明主体而不是表达主体的lambda?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

消费者为什么接受带有声明主体而不是表达主体的lambda?

首先,值得一看的是什么

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
]函数类型一致。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437413.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号