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

我不太明白的是为什么 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 表达式的主体中?这样我就可以知道编译器何时会给出编译器错误以及原因。

非常感谢你,如果我没有很好地解释自己,我很抱歉,我是新来的。


神不在的星期二
浏览 125回答 2
2回答

汪汪一只猫

规范中明确定义,如果 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; }具体取决于目标类型。

小唯快跑啊

中定义的单个抽象方法的返回类型定义了FunctionalInterfacelambda 的推断方式。例如,Consumer<String>示例中的共享可以表示为匿名类,例如:// Consumer<String> consumer = s -> s.isEmpty();Consumer<String> consumer = new Consumer<String>() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public void accept(String s) {&nbsp; &nbsp; &nbsp; &nbsp; s.isEmpty(); // treated as void here&nbsp;&nbsp; &nbsp; }};表示为 a 的相同 lambda 表达式Predicate<String>可以转换为匿名类,例如:// Predicate<String> predicate = s -> s.isEmpty();Predicate<String> predicate = new Predicate<String>() {&nbsp; &nbsp; @Override&nbsp; &nbsp; public boolean test(String s) {&nbsp; &nbsp; &nbsp; &nbsp; return s.isEmpty(); // returns boolean here&nbsp; &nbsp; }};
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java