10赞
719
当前位置:  开发笔记 > 编程语言 > 正文

为什么.forEach(val->list.add())编译而.forEach(val->true)不编译?

如何解决《为什么.forEach(val->list.add())编译而.forEach(val->true)不编译?》经验,为你挑选了1个好方法。



1> Naman..:

虽然你可能正在寻找

Stream.of(1,2,3).forEach(list::add); // adding all to `list`

为什么第一个例子编译如果List接口有以下签名boolean add(E e)

主要是因为在第一次调用中忽略了该方法的返回类型.这就是它扩展到:

Stream.of(1,2,3).forEach(new Consumer() {
    @Override
    public void accept(Integer i) {
        list.add(1); // ignored return type
    }
});  // COMPILES

另一方面,另一个lambda表示更像是a Predicate(也是a FunctionalInterface),表示为true始终从其test方法返回.如果您甚至尝试将其表示为a Consumer,它可能看起来像

Stream.of(1,2,3).forEach(new Consumer() {
    @Override
    public void accept(Integer i) {
        return true; // you can correlate easily now why this wouldn't compile 
    }
});  // DOES NOT COMPILE!

通过Brian的评论添加到设计基础

Java允许您调用方法并忽略返回值(方法调用表达式作为语句).由于我们在调用时允许这一点,因此我们在将方法适用于其参数兼容但功能接口为void返回的功能接口时也允许这样做.

编辑:用他自己的语言表达,尽可能接近语言规范:

更准确地说,list.add(x)是一个语句表达式,因此是无效兼容的.true不是语句表达式,因此不是void兼容的.forEach(Consumer)需要与 空隙兼容的lambda.


更准确地说,`list.add(x)`是_statement expression_,因此是void兼容的.`true`不是语句表达式,因此不兼容void.`forEach(Consumer)`需要一个与void兼容的lambda.
推荐阅读
devbox
冠吸柏芝霆疯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4