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; }
具体取决于目标类型。
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
}
};
添加回答
举报