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,所以即使抛出它也不能返回异常?
Java语言规范描述了lambda表达式的主体
lambda主体是单个表达式或块(第14.2节).
然而,这,
throw new IllegalArgumentException("fail")
Run Code Online (Sandbox Code Playgroud)
是throw 陈述,而不是表达.因此编译器将其拒绝为lambda表达式的主体.
你可以走下兔洞,了解所有类型的表达方式,在这里(遵循语法).