检索可空可选值中的值的最佳方法是什么?

kan*_*ane 2 java functional-programming scala java-8 option-type

假设您有一个Optional<T>变量可以采用 3 个值之一:

  • 值T
  • 一个带有空 T 的可选值
  • 变量本身为 null

检索值Tnull其他值的最佳方法是什么?

这是一种方法:

Optional<String> op = ...
String str = op != null ? op.orElse(null) : null;
Run Code Online (Sandbox Code Playgroud)

这是另一种方法:

String str = Optional.ofNullable(op).flatMap(innerOpt -> innerOpt).orElse(null);
Run Code Online (Sandbox Code Playgroud)

各自的优点和缺点是什么?性能更高吗?又是一种 scala 式的吗?是否更具可读性/可维护性?

And*_*cus 5

第一个可以简化为:

String str = op.orElse(null);
Run Code Online (Sandbox Code Playgroud)

这将是您所写的最易读的可能性。

人们常说,这Optional不是为了null处理,但我认为这只是品味问题。假设你必须像在 kotlin 中一样进行链接:

object?.child?.grandChild
Run Code Online (Sandbox Code Playgroud)

在每个级别,我们都执行空检查。在java中它将是:

object == null ? null : (object.child == null ? null : object.child.grandChild)
Run Code Online (Sandbox Code Playgroud)

这有点伤眼。它会写:

Optional.ofNullable(object)
    .map(Parent::getChild)
    .map(Child::getGrandChild)
    .orElse(null);
Run Code Online (Sandbox Code Playgroud)

可能有点冗长,但对我来说 - 非常可读。正如我所说 - 这是一个品味问题。

PS:Optional这是一种通过将其包装在 monad 中来简化处理的方法null。不要放任Optional不管null

  • @Maarten-reinstateMonica 所以你会选择第一个选项? (2认同)