0

我试图了解 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

3个选择背后的原因是什么?如果适用,从函数式编程的角度来看,什么可以被认为是最“纯粹”或“正确”的?例如,就查看Option类型为 monad 而言,什么是最正确的;或者什么可以被认为是最可组合的?知道如何在允许空值的函数式语言中处理这一点也很有趣。

4

1 回答 1

1

我没有看到 Guava 行为的真正原因。至于其他两个,就看作者如何定义空值了:

  • 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 自然数?:)

于 2016-06-23T09:56:05.440 回答