仅供参考:
提出的JDK8可选类
确实满足 了Monad的三个定律。这是一个证明这一点的要点。
一个Monad所要做的就是提供符合 三个* 定律的 两个 功能。 *
两个功能:
将 值放在单子语境中
- Haskell的Maybe:
return
/Just
- Scala的选择:
Some
- 功能性Java的选择:
Option.some
- JDK8的可选:
Optional.of
在单子上下文中 应用 函数
Haskell的Maybe :(
>>=
又名bind
)- Scala的选择:
flatMap
- 功能性Java的选择:
flatMap
- JDK8的可选:
flatMap
- Haskell的Maybe:
请参见上述要点,以获取有关这三个定律的Java演示。
注意:要理解的关键事项之一是 要在monadic上下文中应用 的 函数 签名:它采用原始值类型,并返回monadic类型。
换句话说,如果您具有的实例
Optional<Integer>,则可以传递给其
flatMap方法的函数将具有签名
(Integer) ->Optional<U>,其中
U是,而不必是的值类型
Integer,例如
String:
Optional<Integer> maybeInteger = Optional.of(1);// Function that takes Integer and returns Optional<Integer>Optional<Integer> maybePlusOne = maybeInteger.flatMap(n -> Optional.of(n + 1));// Function that takes Integer and returns Optional<String>Optional<String> maybeString = maybePlusOne.flatMap(n -> Optional.of(n.toString));
您不需要任何Monad接口即可以这种方式进行编码或以这种方式进行思考。在Scala中,您不会编码到Monad接口(除非您正在使用Scalaz库…)。看来,JDK8还将使Java人员也能够使用这种
链式单子计算 风格。
希望这会有所帮助!
更新: 在此处博客有关此内容。



