在简单的空检查上使用(平面)地图的优点?

时间:2016-05-09 11:01:33

标签: java

我正在阅读以下资料,我想知道为什么我会使用flatmap方式。正如我所看到的那样,实例化了更多的对象,代码执行比通过if语句的简单null检查执行,这将在第一个null上终止,而不用去检查其他对象并且在包装器中整齐地适合。

正如我所看到的那样,检查是否更快+更多的内存安全(速度对我来说非常重要,因为我通常只有2-3毫秒才能执行大量代码,如果有的话)

使用"(平面)地图"有什么好处?可选方式?我为什么要考虑改用它?

来自http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

class Outer {
    Nested nested;
}

class Nested {
    Inner inner;
}

class Inner {
    String foo;
}
  

为了解析外部实例的内部字符串foo,您必须添加多个空检查以防止可能的NullPointerExceptions:

Outer outer = new Outer();
if (outer != null && outer.nested != null && outer.nested.inner != null) {
    System.out.println(outer.nested.inner.foo);
}
  

利用可选平面操作可以获得相同的行为:

Optional.of(new Outer())
    .flatMap(o -> Optional.ofNullable(o.nested))
    .flatMap(n -> Optional.ofNullable(n.inner))
    .flatMap(i -> Optional.ofNullable(i.foo))
    .ifPresent(System.out::println);

1 个答案:

答案 0 :(得分:3)

我认为Optional的使用在更广泛的流媒体环境中会更清晰,而不是单行。

假设我们正在处理名为ArrayList的{​​{1}} Outers,并且要求获取items字符串流(如果存在)。

我们可以这样做:

foo

但我不得不重复一遍,关于如何从外部(//bad example, read on Stream<String> allFoos = list.stream() .filter(o -> o != null && o.nested != null && o.nested.inner != null) .map(o -> o.nested.inner.foo); o != null && o.nested != null && o.nested.inner != null)获取字符串

o.nested.inner.foo

这也为我提供了一种插入默认值的简便方法:

Stream<String> allFoos =
        list.stream()
                .map(o -> Optional.ofNullable(o)
                        .map(t -> t.nested)
                        .map(n -> n.inner)
                        .map(i -> i.foo))
                .filter(s -> s.isPresent())
                .map(s -> s.get());

替代方案可能如下所示:

Stream<String> allFoos =
            list.stream()
                    .map(o -> Optional.ofNullable(o)
                            .map(t -> t.nested)
                            .map(n -> n.inner)
                            .map(i -> i.foo)
                            .orElse("Missing"));