我正在阅读以下资料,我想知道为什么我会使用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);
答案 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"));