Java 如何在Guava中保存空值可选

Java 如何在Guava中保存空值可选,java,guava,Java,Guava,我是番石榴图书馆的新手 我试图在我的方法参数中使用Optional。我发现的一个问题是,我不可能将null值传递给Optional 我认为引入Optional的目的是为了区分 没有价值的东西 具有空值的东西 例如,Optional.缺席()表示该值不存在。而null是一个存在的值 有了这个逻辑,我假设Optional必须有某种方法允许我们在其中保存空值。然而,我找不到一个方法来做到这一点 我的方法定义为: void myMethod(Optional<String> argument

我是番石榴图书馆的新手

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

我认为引入Optional的目的是为了区分

  • 没有价值的东西
  • 具有空值的东西
  • 例如,Optional.缺席()表示该值不存在。而null是一个存在的值

    有了这个逻辑,我假设Optional必须有某种方法允许我们在其中保存空值。然而,我找不到一个方法来做到这一点

    我的方法定义为:

    void myMethod(Optional<String> arguments) {
        ....
    }
    
    它会告诉我运行时错误,表示该值不能为null

    如何在可选的内部传递null?

    请参阅

    可能包含对另一个对象的非空引用的不可变对象 对象此类型的每个实例都包含一个非null 引用,或不包含任何内容(在这种情况下,我们称 引用是“缺席”);它从未被称为“包含
    null

    [……]


    我认为这是有意的限制

    可选
    是的一个实现。这是为了以一种类型安全的方式替换null,保证如果选项值存在,那么在尝试使用它时不会得到
    NullPointerException
    。允许您插入
    null
    将破坏此类型的安全保证


    如果您确实需要区分两种“无数据”值,请考虑使用<代码>可选<代码>(用<代码> >可选的将您的内部可能的空数据封装在<代码>选项> .F/NP> < P> >使用<代码> >可选。可从空(t nulLabeleRead)< /代码>

    < P>从谷歌/番石榴RePO中,您应该使用

    Optional.absent()
    

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

    你完全没有
    可选的
    ,请阅读。一般来说,
    Optional
    不用于方法参数,而是作为结果使用。@Xaerxess在哪里说
    Optional
    不用于方法参数?@milkplusvellocet 1)在将
    Optional
    引入Java 8时:
    Optional
    应该被视为
    OptionalResult
    ?2) 请阅读甲骨文。3) :我们建议您使用Optional作为方法的返回类型,但不一定是在方法参数中。@Xaerxess确实,Guava开发人员并不积极推荐它-也许OP有一个很好的理由以这种方式使用它。
    Optional
    作为参数没有意义的主要原因是有更好的方法使参数可选:主要是,创建一个不带参数的方法重载。它不是完全参数化的,所以我不会说它形成了一个Monad。不允许插入
    null
    实际上会破坏类型安全性(正是因为我们进行了非参数
    null
    检查)。这会创建一个不存在的可选,不是问题中所问的包含空值的可选项。@Dušan包含空值的可选项是什么样子的?简单地说是
    可选项。fromNullable(null)
    可选项相同。缺席(),不是包含空值的可选项。但是这两者是等价的,所以我不确定你的观点是什么?我的观点是可选的不能包含空值。考虑<代码>可选。FuxNulLable(NULL)。GET()/Cult>将引发异常,它将不会返回null。
    
    Optional.absent()