java - 映射嵌套可选?

标签 java lambda java-8 guava option-type

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

假设我有一个 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()”,而不是同时调用它们两次。有什么办法可以做到这一点?

最佳答案

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

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");
}

关于java - 映射嵌套可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28613028/

相关文章:

spring - 如何使用 JDK8 功能重写 jdbcTemplate 查询?

json - 如何在 ReSTLet 中注册 Jackson Jdk8 模块

c++ - 是否存在无法避免 lambda 中的尾随返回类型语法的情况?

java - 当应用程序处于后台时,Firebase 推送通知 Activity 未打开?

java - 测试仍然从真实的SharedPreferences中读取

java - getMap() 出错?

amazon-web-services - 如何在 lambda 中运行同步 dynamodb 请求?

ruby - Perl 的 __SUB__ 模拟 Ruby

java - 如何使用 Java-8 Streams 将 n 维数组映射到另一种类型?

java - 如何将操作栏导航下拉菜单放置在主详细布局中第二个 fragment 上方