【问题标题】:Mapping a Nested Optional?映射嵌套选项?
【发布时间】:2015-02-19 17:33:06
【问题描述】:

Java 8“可选”容器遇到了一个乏味的问题。我无法将 Optional 映射到“冒泡”另一个 Optional。

假设我有一个 RussianNestingDoll 类

  public class NestedOptionalTest {

    public static void main(String[] args) { 

        RussianNestingDoll doll  = RussianNestingDoll.createInstance(RussianNestingDoll.createInstance(RussianNestingDoll.createInstance()));

        Optional<Optional<RussianNestingDoll>> thirdDollContents = doll.getInnerDoll().map(d -> d.getInnerDoll());

        if (thirdDollContents.isPresent() && thirdDollContents.get().isPresent()) { 
            System.out.println(thirdDollContents.get().get());
        }
        else { 
            System.out.println("empty");
        }
    }

    private static final class RussianNestingDoll { 
        private final Optional<RussianNestingDoll> innerDoll;

        public Optional<RussianNestingDoll> getInnerDoll() { 
            return innerDoll;
        }

        private RussianNestingDoll(Optional<RussianNestingDoll> innerDoll) { 
            this.innerDoll = innerDoll;
        }
        public static RussianNestingDoll createInstance() { 
            return new RussianNestingDoll(Optional.empty());
        }
        public static RussianNestingDoll createInstance(RussianNestingDoll innerDoll) { 
            return new RussianNestingDoll(Optional.of(innerDoll));
        }
    }
}

最好不必使用嵌套的可选项,而只需使用可选的“冒泡”。这样我就可以只调用一次“isPresent()”和“get()”,而不是同时调用它们两次。有没有办法我可以做到这一点?

【问题讨论】:

    标签: java lambda java-8 guava optional


    【解决方案1】:

    我不太确定你想要什么,但你可以像这样重写你的代码:

    RussianNestingDoll doll  = RussianNestingDoll.get(RussianNestingDoll.get(RussianNestingDoll.get()));
    
    String content = doll.getInnerDoll()
                     .flatMap(d -> d.getInnerDoll())
                     .map(d -> d.get().toString())
                     .orElse("empty");
    System.out.println(content);
    

    如果您以后想使用娃娃:

    Optional<RussianNestingDoll> thirdDoll = doll.getInnerDoll()
                     .flatMap(d -> d.getInnerDoll());
    
    if (thirdDoll.isPresent()) {
      System.out.println(thirdDoll.get());
    }
    else {                 
      System.out.println("empty");
    }
    

    【讨论】:

    • 这很有帮助。我有这个可选依赖关系树(每个可选依赖项都有不同的类型),检查和导航真的很乏味。这使它变得更好。
    • @ThomasN。很高兴我能帮忙:)
    【解决方案2】:

    你想flatMap吗?

    thirdDollContents
        .flatMap(Function.identity()) // un-nest, get back an Optional<RussianNestingDoll>
        .get() // or isPresent()
    

    如果thirdDollContents 是empty,flatMap 将返回一个空的Optional。

    【讨论】:

    • Function.identity() 到底是什么?我不太清楚它是什么,Eclipse 也不知道。这是我应该实现的东西的占位符吗?
    • @ThomasN。它是java.util.function.Function#identity,对返回其参数的Function 实例的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2020-03-06
    • 1970-01-01
    • 2020-07-17
    • 2023-03-29
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多