我意识到Java8lambda实现可能会发生变化,但在lambda构建b39中,我发现只有当lambda表达式返回非空类型时,才能省略大括号。例如,这段代码编译:
public class Collections8 {
public static void main(String[] args) {
Iterable<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.filter(e -> e.length() > 4).forEach(e -> { System.out.println(e); });
}
}
但是像这样去掉大括号:
names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e));
给出了错误
Collections8.java:6: error: method forEach in interface Iterable<T> cannot be applied to given types;
names.filter(e -> e.length() > 4).forEach(e -> System.out.println(e));
^
required: Block<? super String>
found: lambda
reason: incompatible return type void in lambda expression
where T is a type-variable:
T extends Object declared in interface Iterable
有人能解释一下这是怎么回事吗?
发布于 2012-06-22 04:10:44
当lambda主体是单个表达式或void方法调用时,可以省略大括号。每个表达式的计算结果都是一个值,因此不能为空。
如果lambda的主体是一个语句块(例如,一系列计算,然后是一个return
语句),或者lambda没有值(例如,有一个void
返回类型),并且不是一个单独的void方法调用,那么您必须使用块形式,这需要使用方括号。
在块样式的lambda中,如果一个值是return
ed的,那么所有可能的代码路径必须要么return
一个值,要么throw
一个Throwable
。
发布于 2013-04-08 23:58:18
如果没有大括号,lambda会自动返回->操作符后面的一个表达式。
因此,当您有一个不返回任何内容的lambda时,必须使用大括号
https://stackoverflow.com/questions/11145696
复制相似问题