Java 为变量(如果存在)分配可选值

Java 为变量(如果存在)分配可选值,java,lambda,optional,Java,Lambda,Optional,嗨,我使用Java可选。我看到可选的有一个方法ifPresent 而不是像这样做: Optional<MyObject> object = someMethod(); if(object.isPresent()) { String myObjectValue = object.get().getValue(); } 我需要什么样的lambda函数才能获得分配给该变量的值 您可以使用或来提高代码的可读性 Optional object=someMethod(); 字符串my

嗨,我使用Java可选。我看到可选的有一个方法ifPresent

而不是像这样做:

Optional<MyObject> object = someMethod();
if(object.isPresent()) {
    String myObjectValue = object.get().getValue();
}
我需要什么样的lambda函数才能获得分配给该变量的值

您可以使用或来提高代码的可读性

Optional object=someMethod();
字符串myValue=object.orElse(新的MyObject()).getValue();

Optional object=someMethod();
字符串myValue=object.orelsetrow(RuntimeException::new).getValue();

您需要做两件事:

  • 将您的
    Optional
    转换为
    Optional
    ,如果原始Optional具有值,则该值具有值。您可以使用:
    object.map(MyObject::toString)
    (或者您想要使用的任何其他方法/函数)来完成此操作
  • 获取
    可选项的字符串值,或者如果可选项没有值,则返回默认值。为此,您可以使用
  • 结合这些:

    String myValue = object.map(MyObject::toString).orElse(null);
    

    很晚了,但我做了以下几点:

    String myValue = object.map(x->x.getValue()).orElse("");
                               //or null. Whatever you want to return.
    

    可选l=stream.filter….//Java8流条件

            if(l!=null) {
                ObjectType loc = l.get();
                Map.put(loc, null);
            }
    
    .findFirst()
    返回一个
    可选的
    ,但是如果我们添加
    .orElse(null)
    ,它将返回可选的if
    isPresent()
    ,即(
    MyType
    ),否则返回一个
    null

    MyType s = newList.stream().filter(d -> d.num == 0).findFirst().orElse(null);
    

    如果你的
    myValue
    行想说什么呢?“如果对象有一个值,那么myValue是某个无关函数getValue()的结果。”?如果是这样的话,那么如果对象没有值会发生什么——那么您希望
    myValue
    是什么呢?我的可选项中的MyObject类有一个getter,它将返回myValue,因此我肯定知道如果可选项不是空的,则存在一个值。getValue()中的值永远不能为null/未定义,但如果可选值为空,则应为myValue分配什么?您可以使用三元形式(如
    String myValue=object.isPresent())简化if语句?object.get().getValue():“一些默认字符串”
    ,但您仍然必须提供
    object.isPresent()
    返回false的情况。这种情况违背了
    可选
    的目的。在第一种情况下,当我需要字符串时,您返回MyObject类型的对象。第二个可以正常工作。
    object.orElse(new MyObject()).getValue()
    将始终创建
    MyObject
    的新实例。相反,最好使用
    object.orElseGet(..)
    ,它接受一个将被延迟计算的函数。这是对
    map()
    orElse()
    的很好解释+1.在评论中,OP说使用
    null
    作为默认值,但我强烈建议使用非null值。如果将
    null
    用作默认值,则
    myValue
    的下游用户将不得不编写额外的代码来防范它。
    MyType s = newList.stream().filter(d -> d.num == 0).findFirst().orElse(null);