【问题标题】:'Optional.get()' without 'isPresent()' check'Optional.get()' 没有 'isPresent()' 检查
【发布时间】:2016-12-08 02:29:37
【问题描述】:

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

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

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

我知道有一种情况是什么都没找到,应该处理,但是如何处理?

这就是它想要的这个脏话吗:

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

?

如何解决?如果没有找到,我希望返回null

更新

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

【问题讨论】:

  • 请注意,您不应在 Java 中使用 $ 作为标识符:JLS Sec 3.8:“$ 符号应仅用于机械生成的源代码,或者很少用于访问预先存在的源代码旧系统上的名称。”

标签: java java-8 java-stream optional


【解决方案1】:

get() 替换为orElse(null)

【讨论】:

  • 为什么? :) 为什么orElse 以“或”开头?
  • 因为那是方法名。而else 是一个关键字。
  • @Dims 它只是 getOrElse 的一种简短形式,只是省略了 get。使用 optional 你通常应该使用orElse 而不是get 因为get 会在值为空时抛出异常。
  • @puhlen orElseGet() 采用 Supplier<T>,而 orElse() 采用 T。这些是不等价的。
  • @bcsb1001 这不是他想说的,“getOrElse”是他为解释orElse 的目的而发明的名称;在他的评论中没有提到orElseGet ;)
【解决方案2】:
...findFirst().orElse(null);

如果存在则返回值,否则返回null。文档says 表示传递的参数可能是nullorElseGetorElseThrow 禁止使用)。

【讨论】:

  • 部分正确。 findFirst() 具有以下规则:“当没有遇到顺序时,它会从 Stream 中返回任何元素。” -> 所以如果你的过滤器没有返回匹配的元素, findFirst() 将返回第一个(除了流是空的​​)
【解决方案3】:

我的解决办法是这样检查

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

【讨论】:

    【解决方案4】:

    创建了Optional,因此代码可以在这几十年之后,最终开始避免 null。

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

    【讨论】:

    • 这是一个准确但具有欺骗性的陈述,因为如果选项不存在,在访问时仍然会抛出错误。从避免 null 的角度来看,所有 optional 所做的只是更改错误类型,因为实际上您仍然必须对其进行 null 检查。在这种情况下,可选项提供的是控制空指针错误发生的位置。任何在使用流开发时必须调试空点的人都知道,调试起来非常棘手。选项允许我们将此错误传递给更高的级别,从而使我们能够精确地定位问题。
    • 这就是我所说的“妥善处理”。如果信息可能“不存在”,那么为了代码的稳健性,“存在”检查必须写在某处(一种或另一种方式)但重点是可空对象很容易忘记,而如果类型系统明确告诉您“嘿,这不是 Foo 而是可选的,您必须先 .get() 它”,那么可能会提醒专业人员他们必须做“存在” " 也检查一下,最重要的是,他们可能会被提醒他们还应该考虑在信息不存在的情况下该怎么做。
    猜你喜欢
    • 2021-05-10
    • 2019-12-25
    • 2022-07-11
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2022-01-19
    • 2019-08-09
    相关资源
    最近更新 更多