我试图理解 Java 生态系统中 3 个最常用的实现中不同选项/可选语义背后的原因: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,什么是最正确的;或者什么可以被认为是最可组合的?了解在允许空值的函数语言中如何处理这一点也很有趣。
最佳答案
我没有看到 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
可以使用。
至于“纯粹”或“正确”,可能与旧的is 0 a natural number?类似的答案:)
关于java - Java 中不同的可选/选项语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37987147/