【发布时间】:2020-04-05 01:08:00
【问题描述】:
假设您有一个 Optional<T> 变量,它可以采用 3 个值之一:
- 值 T
- 一个带有空 T 的 Optional
- 变量本身为空
否则,检索值 T 或 null 的最佳方法是什么?
这是一种方法:
Optional<String> op = ...
String str = op != null ? op.orElse(null) : null;
这是另一种方法:
String str = Optional.ofNullable(op).flatMap(innerOpt -> innerOpt).orElse(null);
各有什么优缺点?还有一个性能更好吗?是更多的scala-esque吗?是否更具可读性/可维护性?
【问题讨论】:
-
一个 Optional 永远不应该为空。如果是这种情况,请不要解决它:修复代码。
-
确实如此。一种可能的解决方法是使用
Optional<Optional<T>>;) 虽然如果您首先需要它,我会严重怀疑您的 model。 -
为什么这个标签是“scala”?这显然是一个 java 问题。
-
@BrianMcCutchon 是Java中空的定义,一个带有空值的Optional;没有。
-
@som-snytt Optional 的定义是“可能包含也可能不包含非空值的容器对象”(来自the JavaDoc)。一个空的 Optional 可以通过存储 null 来实现,但这是一个实现细节。 JavaDoc 始终使用诸如“如果存在值”和“空可选”之类的短语。我们应该避免使用诸如“空值”之类的模棱两可的语言,这听起来像是指的是
Optional.of(null)(它会引发 NPE)。
标签: java scala java-8 functional-programming optional