为什么Idea lint警告缺少`isPresent()`检入`orElseGet`?

Bla*_*ght 5 java optional java-8

假设我不知道一个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);
}
Run Code Online (Sandbox Code Playgroud)

在我的真实代码中,Idea在此时警告我:

'Optional.get()'没有'isPresent()'检查.

这是为什么?我priorly检查,如果任一a或b存在.此外,此代码按预期工作,输出为10.如果我把b = Optional.of("2")输出仍然10是因为我更喜欢a.如果我然后放a = Optional.empty(),输出是2预期的.

我做错了什么,或者是Idea的错误?

Eug*_*ene 4

这里的想法很混乱,它的内部规则可能假设检查isPresent在同一个可选链中。

这显然不属于Optional检查本身,因为(a.isPresent() || b.isPresent());由于这些检查,不可能告诉您无法调用orElseGet空可选...b

  • @Blacklight,正确的做法是填补这个错误,看看它们指向什么;那里的开发人员“通常”反应非常灵敏。您可以通过这种方式改进该工具 (2认同)