【问题标题】:How to save null value in Guava Optional如何在 Guava Optional 中保存空值
【发布时间】:2013-09-04 08:41:56
【问题描述】:

我是 Guava 库的新手。

我正在尝试在我的方法参数中使用 Optional。我发现的一个问题是我不可能将 null 值传递给 Optional。

我觉得引入Optional的目的是为了区分

  1. 没有价值的东西
  2. 具有空值的东西

例如,Optional.absent() 表示该值不存在。而 null 是一个存在的值。

根据这个逻辑,我假设 Optional 必须有某种方法允许我们在其中保存一个空值。但是,我找不到这样做的方法。

我的方法定义为:

void myMethod(Optional<String> arguments) {
    ....
}

如果我使用

myMethod(Optional.of(null));

它会给我运行时错误,说值不能为空。

如何在 Optional 中传递 null?

【问题讨论】:

标签: java guava


【解决方案1】:

我认为这是故意的限制。

Optionalthe Maybe monad 的实现。这旨在以类型安全的方式替换空值,保证如果选项值存在,当您尝试使用它时不会得到NullPointerException。允许您插入 null 会破坏这种类型安全保证。

如果您确实需要区分两种“无数据”值,请考虑改用Optional&lt;Optional&lt;String&gt;&gt;(使用Optional.fromNullable 将内部可能为空的数据包装在Option&lt;String&gt; 中)。

【讨论】:

  • 它不是完全参数化的,所以我不会说它形成一个 Monad。不允许插入 null 实际上会破坏类型安全(正是因为我们进行了非参数 null 检查)。
【解决方案2】:

JavaDoc

一个不可变对象,可能包含对另一个对象的非空引用 目的。此类型的每个实例都包含一个非 null 参考,或不包含任何内容(在这种情况下,我们说 参考是“缺席”);从来没有说过它“包含null”。

[...]

【讨论】:

    【解决方案3】:

    使用Optional.fromNullable(T nullableReference)

    【讨论】:

    • 这会创建一个缺失的 Optional,而不是一个包含问题中所要求的空值的 Optional。
    • @Dušan 包含空值的 Optional 是什么样的?
    • 简单地说Optional.fromNullable(null)Optional.absent()是一样的
    • 对,但是您之前提到我的答案导致缺少 Optional,而不是包含 null 值的 Optional。但是两者是等价的,所以我不确定你的意思是什么?
    • 我的意思是 Optional 永远不能包含空值。考虑Optional.fromNullable(null).get()会抛出异常,它不会返回null。
    【解决方案4】:

    来自 google/guava repo 的 this wiki,您应该使用

    Optional.absent()
    

    @Dušan 已经在对另一个答案的评论中写了它,但我想这样会更容易被其他人找到

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 1970-01-01
      • 2015-03-06
      • 2015-02-15
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多