首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java 8 lambda语法中,什么时候大括号是可选的?

在Java 8 lambda语法中,什么时候大括号是可选的?
EN

Stack Overflow用户
提问于 2012-06-22 03:49:17
回答 2查看 11.4K关注 0票数 18

我意识到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

有人能解释一下这是怎么回事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-22 04:10:44

当lambda主体是单个表达式或void方法调用时,可以省略大括号。每个表达式的计算结果都是一个值,因此不能为空。

如果lambda的主体是一个语句块(例如,一系列计算,然后是一个return语句),或者lambda没有值(例如,有一个void返回类型),并且不是一个单独的void方法调用,那么您必须使用块形式,这需要使用方括号。

在块样式的lambda中,如果一个值是returned的,那么所有可能的代码路径必须要么return一个值,要么throw一个Throwable

票数 23
EN

Stack Overflow用户

发布于 2013-04-08 23:58:18

如果没有大括号,lambda会自动返回->操作符后面的一个表达式。

因此,当您有一个不返回任何内容的lambda时,必须使用大括号

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11145696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档