不带“ isPresent()”检查的“ Optional.get()”


88

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

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

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

我了解在某些情况下什么也找不到,应该对其进行处理,但是如何处理呢?

这是这个咒骂所要的:

'Optional.get()' without 'isPresent()' check

怎么修?null如果没有发现,我希望返回。

更新

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


2
请注意,您不应$在Java中用作标识符:JLS Sec 3.8:“ $符号仅应在机械生成的源代码中使用,或很少用于访问旧系统上的现有名称。”
安迪·特纳

Answers:


179

替换get()orElse(null)


1
为什么?:)为什么orElse以“或”开头?
2013年

15
因为那是方法名称。并且else是一个关键字。
安迪·特纳

8
@Dims只是getOrElse的简短形式,只是省略了get。使用可选时,通常应使用orElse而不是,get因为get如果该值为null,则将引发异常。
puhlen '16

4
@puhlenorElseGet()需要一个Supplier<T>,而orElse()需要一个T。这些不相等。
bcsb1001

1
@ bcsb1001并不是他试图说的,“ getOrElse”是他发明用来解释其目的的名称orElseorElseGet他的评论中没有提及;)
罗里姆(Rorrim

22
...findFirst().orElse(null);

返回值(如果存在),否则返回null。该文档,传递的参数可能是nullorElseGet和禁止使用的参数orElseThrow)。


1
这部分是正确的。findFirst()具有以下规则:“没有遇到顺序时,它将返回流中的任何元素。” ->因此,如果您的过滤器未返回匹配的元素,则findFirst()将返回第一个(除非流事先为空)
Fl0R1D3R

1

我的解决方案是这样检查

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}

0

创建了Optional后,代码可以在所有这几十年后终于避免使用null。

删除.get(),返回Optional本身,并使调用代码正确处理(就像在您返回null的情况下一样)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.