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

Ash*_*Ash 5 java lambda exception-handling java-8

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

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

你为什么不能拥有?

m.computeIfAbsent("", s -> throw new IllegalArgumentException("fail"));
Run Code Online (Sandbox Code Playgroud)

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

Sot*_*lis 7

Java语言规范描述了lambda表达式的主体

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

然而,这,

throw new IllegalArgumentException("fail")
Run Code Online (Sandbox Code Playgroud)

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

你可以走下兔洞,了解所有类型的表达方式,在这里(遵循语法).