java - 为什么抛出运行时异常的 Java Lambda 需要括号?

标签 java lambda exception-handling java-8

我知道 java 中的 lambda 不能抛出检查异常,但可以抛出 RuntimeException,但为什么下面的代码需要括号?

Map<String, Integer> m = new HashMap<>();
Integer integer = m.computeIfAbsent("", s -> {throw new IllegalArgumentException("fail");});

为什么你不能拥有?

m.computeIfAbsent("", s -> throw new IllegalArgumentException("fail"));

是不是因为编译器假设它会在这个实例中返回一个 int,所以即使它被抛出也不能返回异常?

最佳答案

Java 语言规范 describes the body of a lambda expression

A lambda body is either a single expression or a block (§14.2).

然而,这

throw new IllegalArgumentException("fail")

throw statement ,不是一个表达式。因此,编译器拒绝将其作为 lambda 表达式的主体。

您可以深入了解所有类型的表达式,here (遵循语法)。

关于java - 为什么抛出运行时异常的 Java Lambda 需要括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41961392/

相关文章:

java - 从 ActiveMQ 并行消费消息

java - 如何避免转义 WebTarget 查询参数?

C++ 测试 lambda 函数

c++ - 没有除了风格和性能的练习?

php - 无法捕获 symfony FatalErrorException

java - 为什么连续两次调用同一方法会产生不同的执行时间?

java - java中使用通配符的hashmap无法赋值

c++ - boost::remove_if 导致错误(只读变量不可赋值)

java - 将对象列表转换为 <String,Map<String,Integer>> java8 流的映射

php - PHP异常,错误并提供用户反馈