gpt4 book ai didi

java - 使用(平面)映射优于简单的空检查的优点?

转载 作者:行者123 更新时间:2023-11-30 08:02:10 27 4
gpt4 key购买 nike

我正在阅读下面的源代码,我想知道我到底为什么要使用平面图方式。正如我所看到的,与通过 if 语句进行简单的 null 检查相比,实例化了更多的对象,执行了更多代码,这将在第一个 null 时终止,而不必费心检查其他对象,并且非常适合包装器。

在我看来,if 检查更快 + 内存更安全(速度对我来说真的很重要,因为我通常只有 2-3 毫秒来执行很多代码,如果有的话)

使用“(flat)Map”可选方式有什么好处?我为什么要考虑改用它?

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

class Outer {
Nested nested;
}

class Nested {
Inner inner;
}

class Inner {
String foo;
}

In order to resolve the inner string foo of an outer instance you have to add multiple null checks to prevent possible NullPointerExceptions:

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

The same behavior can be obtained by utilizing optionals flatMap operation:

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

最佳答案

我认为 Optional 的使用在更广泛的流上下文中会更清晰,而不是单行。

假设我们正在处理一个名为 itemsOutersArrayList 并且要求获取 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 != nullo.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"));

替代方案可能如下所示:

//bad example (IMO)
Stream<String> allFoos = list.stream()
.map(o -> o != null && o.nested != null && o.nested.inner != null ?
o.nested.inner.foo : "Missing");

关于java - 使用(平面)映射优于简单的空检查的优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37114094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com