当前位置: 首页 > 面试题库 >

Java 8 lambda语法中的花括号何时是可选的?

汪胡非
2023-03-14
问题内容

我意识到Java 8 lambda实现可能会发生变化,但是在lambda build
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

谁能解释这是怎么回事?


问题答案:

当lambda主体是单个表达式或void方法调用时,可以省略花括号。每个表达式都求值,因此不能为空。

如果lambda的主体是语句块(例如,一系列计算后跟一条return语句),或者lambda没有值(即具有void返回类型)并且不是单个void方法调用,则必须使用该块表格,需要括号。

在块式lambda中,如果returned 值,则所有可能的代码路径都必须是returnvalue或throwa Throwable



 类似资料:
  • 问题内容: 我可以看到有两种不同的导入方式 第二个有括号。那么两者之间有什么区别?什么时候应该加上括号?谢谢 问题答案: 那么,是否应该 在方括号中 导入组件之间的区别在于您的方式。 出口有两种类型 默认导出 命名为出口 组件可以有 一个默认导出,零个或多个命名 导出 如果组件是默认导出,则需要不带括号将其导入,例如 导入为 命名的出口可能像 要么 您可以将其导入为 要么 如果您的组件有一个默认导

  • 问题内容: 我试图理解下面两个require语句之间的区别。 具体来说,s包装的目的是什么? 它们似乎都分配了电子模块的内容,但是它们的功能显然不同。 谁能给我一些启示? 问题答案: 第二个示例使用解构。 这将调用从所需模块导出的特定变量(包括函数)。 例如(functions.js): 包含在您的文件中: 现在您可以分别给他们打电话了, 相对于: 使用点表示法调用: 希望这可以帮助。 您可以在此

  • 问题内容: 从react.js教程中,我们可以看到双花括号的用法: 然后在第二个教程“ Thinking in react”中: 但是,React JSX文档没有描述或提及双花括号。此语法(双curies)有什么用?还有另一种方法可以在jsx中表达相同的内容,或者这仅仅是文档中的遗漏? 问题答案: 它只是在prop值中内联的对象文字。和…一样

  • 问题内容: 我正在看书,有一些带有花括号的程序示例 例如 问题答案: 这是一个代码块。在其中声明的变量在上部代码块(这些curl之外的方法体)中不可见,即它们的作用域更加有限。

  • 问题内容: 而且我仍然无法理解花括号的工作原理,特别是由于诸如简单程序这样的页面: http://wiki.python.org/moin/SimplePrograms 在各处使用大括号。我了解方括号和规则的圆括号,但是我不知道“定义字典”的含义或它们应该代表的含义。 问题答案: Python中使用“大括号”来定义字典。字典是一种将一个值映射到另一个值的数据结构,就像英语词典如何将单词映射到其定义

  • 问题内容: 我在jQuery文件中找到了这个: 花括号做什么? 问题答案: 在您的情况下,这是一个传递给CSS函数的对象。 在这里你也可以使用 这是物体的另一个例子