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

Dim*_*ims 64 java optional java-8 java-stream

我在Java中有以下搜索代码:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();
Run Code Online (Sandbox Code Playgroud)

我希望按名称找到列并返回第一个找到的列.

我知道有一个案例,什么都没找到,应该处理,但如何?

这就是它所要的咒骂:

'Optional.get()' without 'isPresent()' check
Run Code Online (Sandbox Code Playgroud)

怎么修?null如果没有找到,我希望回来.

UPDATE

好吧,好吧,我只是没有意识到,那会findFirst()回来Optional.

And*_*ner 139

替换get()orElse(null).

  • 因为这是方法名称.而'else`是一个关键字. (9认同)
  • @Dims只是一个简短形式的getOrElse,只是省略了get.使用可选项时,通常应使用`orElse`而不是`get`,因为如果值为null,`get`将抛出异常. (6认同)
  • 为什么?:) 为什么 `orElse` 以“or”开头? (5认同)
  • @bcsb1001 这不是他想说的,“getOrElse”是他发明的一个名字,用于解释“orElse”的目的;他的评论中没有提到“orElseGet”;) (5认同)
  • @puhlen`或者ElGet()`采用`Supplier <T>`,而`orElse()`采用`T`.这些并不等同. (4认同)

And*_*lko 20

...findFirst().orElse(null);
Run Code Online (Sandbox Code Playgroud)

返回值(如果存在),否则返回null.文档传递的参数可能是null(禁止的内容orElseGetorElseThrow).


Yak*_* Ad 9

我的解决方案是这样检查

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}
Run Code Online (Sandbox Code Playgroud)


Erw*_*out 5

创建Optional是为了让代码在几十年后终于可以开始避免null。

删除 .get(),返回Optional 本身并让调用代码适当地处理它(就像在返回 null 的情况下必须做的那样)。

  • 这就是我所说的“妥善处理”。如果信息可能“不存在”,那么为了代码的稳健性,“存在”检查***必须写在某处***(以一种或另一种方式),但关键是可空对象使得它太容易忘记了,如果类型系统明确告诉你“嘿,这不是 Foo,而是可选的,你必须先 .get() 它”,那么专业人士可能会被提醒他们也必须进行“存在”检查,最重要的是,他们可能会提醒他们还应该考虑在信息不存在的情况下该怎么办。 (4认同)