Java中不同的可选/选项语义



我试图了解Java生态系统中最常用的3个实现的不同选项/可选语义背后的原因:Java 8,功能性Java和Guava。

考虑以下三个片段。

  1. java.util.Optional.of(100).map(i -> null)Optional.empty中导致
  2. fj.data.Option.some(100).map(i -> null)Some(null)中导致
  3. com.google.common.base.Optional.of(100).transform(i -> null)结果NullPointerException

3个选择背后的原因是什么?如果说明,从功能编程的角度来看,什么可以被认为是最"纯"或"正确"的?例如,在将Option类型视为单元方面,最正确的是什么;还是可以认为最合并的是什么?知道如何用允许nulls的功能语言来处理它也很有趣。

我看不到番石榴行为的真正原因。至于其他两个,这取决于作者如何定义空值:

  • java 8定义的 null值为没有值,因此您得到Optional.empty
  • 功能性Java似乎已将null定义为可能的值,与无值不同。

    出于更具体的原因,让我们看一下map定义:

    public final <B> Option<B> map(final F<A, B> f) {
       return isSome() ? some(f.f(some())) : Option.none();
    }
    

    只要"容器"不是None,其转换值就不会为None。要获得类似于Java 8的结果,可以使用fromNull

至于"纯"或"正确",可能与旧的答案类似的答案是0是自然数字吗?:)

最新更新