我试图理解Java生态系统中可能最常用的3种实现中不同的Option / Optional语义背后的原因:Java 8,Functional Java和Guava。
考虑以下三个片段。
java.util.Optional.of(100).map(i -> null)
会产生Optional.empty
。fj.data.Option.some(100).map(i -> null)
会产生Some(null)
。com.google.common.base.Optional.of(100).transform(i -> null)
结果NullPointerException
。 3种选择背后的原因是什么?如果可能,最值得考虑的是什么"纯粹"或"纠正"从功能编程的角度来看?例如,在查看Option
类型为monad方面,最正确的是什么;或者什么可以被认为是最可组合的?了解如何在允许空值的函数式语言中处理它也很有趣。
答案 0 :(得分:1)
我没有看到番石榴行为的真正原因。至于其他两个,它取决于作者如何定义空值:
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?的类似答案:)