我试图了解 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 而言,什么是最正确的;或者什么可以被认为是最可组合的?知道如何在允许空值的函数式语言中处理这一点也很有趣。