Java ';可选。get()';没有';isPresent()';检查

Java ';可选。get()';没有';isPresent()';检查,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我有以下Java搜索代码: return getTableViewController().getMe().getColumns().stream() .filter($ -> Database.equalsColumnName($.getId(), columnId)) .findFirst() .get(); 我希望按名称查找列并返回找到的第一个列 我知道有一种情况是什么也没有发现,应该进行处理,但如何处理呢 这就是它想要的咒骂: 'Optional.get(

我有以下Java搜索代码:

return getTableViewController().getMe().getColumns().stream()
    .filter($ -> Database.equalsColumnName($.getId(), columnId))
    .findFirst()
    .get();
我希望按名称查找列并返回找到的第一个列

我知道有一种情况是什么也没有发现,应该进行处理,但如何处理呢

这就是它想要的咒骂:

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

如何修复?如果未找到任何内容,我希望返回
null

更新

好吧,好吧,我只是没有意识到,
findFirst()
返回
可选的

替换
get()


返回值(如果存在),否则返回
null
。文档说明传递的参数可能是空的(和是禁止的)。

我的解决方案是这样检查它

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

创建Optional是为了让代码在这几十年之后能够最终开始避免null


删除.get(),返回可选项本身,并让调用代码适当地处理它(就像在返回null的情况下一样)。

为什么?:)为什么
orElse
以“or”开头?因为那是方法名。而
else
是一个关键字。@Dims它只是getOrElse的一个简短形式,只是省略了get。对于可选,您通常应该使用
orElse
而不是
get
,因为
get
如果值为空,将引发异常。@puhlen
orElseGet()
接受
供应商
,而
orElse()
接受
T
。这些都是不等价的。@bcsb1001这不是他想说的,“getOrElse”是他为了解释
orElse
的目的而发明的名字;他的评论中没有提到
orElseGet
)请注意,在Java中不应使用
$
作为标识符::“只应在机械生成的源代码中使用$符号,或者很少用于访问遗留系统上预先存在的名称。”这在一定程度上是正确的。findFirst()具有以下规则:“当没有遭遇顺序时,它将从流中返回任何元素。”->因此,如果筛选器不返回匹配的元素,findFirst()将返回第一个元素(流之前为空除外)
if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}