【发布时间】:2017-06-20 19:56:01
【问题描述】:
假设我不知道一个Optional 是空的,还是两者都存在。在后一种情况下,我总是更喜欢a 而不是b:
final Optional<String> a = Optional.of("1");
final Optional<String> b = Optional.empty();
if (a.isPresent() || b.isPresent()) {
// prefer a over b
Integer result = a
.map(s -> s + "0")
.map(Integer::parseInt)
.orElseGet(() -> Integer.parseInt(b.get())); // <-- warning for b.get()
System.out.println(result);
}
在我的真实代码中,Idea 在这一点上警告我:
'Optional.get()' 没有 'isPresent()' 检查。
这是为什么呢?我会事先检查a 或b 是否存在。此外,此代码按预期工作,输出为10。如果我输入b = Optional.of("2"),输出仍然是10,因为我更喜欢a。如果我然后输入a = Optional.empty(),则输出如预期的那样是2。
是我做错了什么,还是 Idea 的 linter 错了?
【问题讨论】:
-
被
a.isPresent() || b.isPresent()条件弄糊涂了,想不通这种情况下b一定存在。 -
@LouisWasserman,实际上条件处理得很好。 IDEA 应该知道
!a.isPresent()意味着!a.map(anything).isPresent()(它现在不知道)。它还必须查看 lambdas/methodref 并了解它们永远不会返回null(否则警告是正确的)。分析的太多了,但以后可能会这样做。