为了账号安全,请及时绑定邮箱和手机立即绑定

具有返回类型的消费者接口的 lambda 表达式

具有返回类型的消费者接口的 lambda 表达式

神不在的星期二 2023-07-28 16:52:12
我不太明白的是为什么 java 编译器允许 lambda 表达式,例如s -> s.isEmpty()在消费者接口内部。我尝试过像s -> s.isEmpty()Consumer 接口那样的 lambda 表达式,它可以正常工作。其他一些 lambda 表达式不起作用,因为它们返回一些内容,例如s -> s.Consumer<String> cons1 = s -> s.isEmpty(); cons1.accept("abc");编译并执行没有问题。所以我遇到的问题是,我认为 lambda 表达式总是s -> s.isEmpty()等价于s -> {return s.isEmpty()};,所以我期望编译器给我一个错误,因为你不能boolean从消费者接口返回 a (或任何其他类型)。isEmpty()显然,如果没有 return 语句,并且该方法只是被调用而没有实际返回值,则编译器会将 lambda 表达式转换为方法。那么问题是 return 何时添加到 lambda 表达式的主体中?这样我就可以知道编译器何时会给出编译器错误以及原因。非常感谢你,如果我没有很好地解释自己,我很抱歉,我是新来的。
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

规范中明确定义,如果 lambda 的主体是语句表达式,如果返回类型为 void,则结果将被丢弃

15.27.3。Lambda 表达式的类型

如果 lambda 的主体是语句表达式(即允许单独作为语句的表达式),则它与产生 void 的函数类型兼容;任何结果都会被简单地丢弃。因此,例如,以下两者都是合法的:

 //Predicate has a boolean result
   Predicate<String> p = s -> list.add(s);
   // Consumer has a void result
   Consumer<String> c = s -> list.add(s);

一般来说, 形式的 lambda () -> expr(其中 expr 是语句表达式)被解释为 或() -> { return expr; }() -> { expr; }具体取决于目标类型。


查看完整回答
反对 回复 2023-07-28
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

中定义的单个抽象方法的返回类型定义了FunctionalInterfacelambda 的推断方式。例如,Consumer<String>示例中的共享可以表示为匿名类,例如:


// Consumer<String> consumer = s -> s.isEmpty();

Consumer<String> consumer = new Consumer<String>() {

    @Override

    public void accept(String s) {

        s.isEmpty(); // treated as void here 

    }

};

表示为 a 的相同 lambda 表达式Predicate<String>可以转换为匿名类,例如:


// Predicate<String> predicate = s -> s.isEmpty();

Predicate<String> predicate = new Predicate<String>() {

    @Override

    public boolean test(String s) {

        return s.isEmpty(); // returns boolean here

    }

};


查看完整回答
反对 回复 2023-07-28
  • 2 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信