Java中不同的Optional / Option语义

时间:2016-06-23 09:10:52

标签: java functional-programming java-8 optional functional-java

我试图理解Java生态系统中可能最常用的3种实现中不同的Option / Optional语义背后的原因:Java 8,Functional 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
  4. 3种选择背后的原因是什么?如果可能,最值得考虑的是什么"纯粹"或"纠正"从功能编程的角度来看?例如,在查看Option类型为monad方面,最正确的是什么;或者什么可以被认为是最可组合的?了解如何在允许空值的函数式语言中处理它也很有趣。

1 个答案:

答案 0 :(得分:1)

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

  • 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();
    }
    

    只要&#39;容器&#39;不是None,其转换后的值不会是None。要获得类似于java 8的结果,可以使用fromNull

纯粹的&#39;或者&#39;纠正&#39;,可能是旧is 0 a natural number?的类似答案:)