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

时间:2017-01-31 15:32:35

标签: 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,所以即使它被抛出也不能返回异常?

1 个答案:

答案 0 :(得分:7)

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

  

lambda主体是单个表达式或块(第14.2节)。

然而,

throw new IllegalArgumentException("fail")

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

你可以走下兔子洞,了解所有类型的表达方式,here(遵循语法)。