java - Java 中不同的可选/选项语义

标签 java functional-programming java-8 option-type functional-java

我试图理解 Java 生态系统中 3 个最常用的实现中不同选项/可选语义背后的原因: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,什么是最正确的;或者什么可以被认为是最可组合的?了解在允许空值的函数语言中如何处理这一点也很有趣。

最佳答案

我没有看到 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/

相关文章:

java - jdbc中MySql更新语句

java - 改造 Https 调用给连接重置

python - 是否有类似 Python 中 Clojure 的线程宏的东西?

java - 从对象列表 java 8 中获取具有转换类型的属性列表

java - 在 lambda 表达式中使用默认方法

java - 是否有适用于所有类(而非接口(interface))的 AspectJ TypePattern?

java - 我需要将 JBoss 工具添加到我的 Eclipse,但我使用的是 springtoolsuite (STS)

haskell - 如何解释函数实例的bind/>>=?

list - 在 OCaml 的列表中查找唯一元素

java - Java 8 Stream API 表示的嵌套 for 循环