我理解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,所以即使它被抛出也不能返回异常?
答案 0 :(得分:7)
Java语言规范describes the body of a lambda expression
lambda主体是单个表达式或块(第14.2节)。
然而,
throw new IllegalArgumentException("fail")
是throw
statement,而不是表达式。因此编译器将其拒绝为lambda表达式的主体。
你可以走下兔子洞,了解所有类型的表达方式,here(遵循语法)。