我试图了解Java生态系统中最常用的3个实现的不同选项/可选语义背后的原因:Java 8,功能性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
类型视为单元方面,最正确的是什么;还是可以认为最合并的是什么?知道如何用允许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是自然数字吗?:)