Monad in Java(

这种代码无论是可读性还是性能都是灾难,但是有趣 (以及研究价值)最重要!Just for fun :)
对Optional,其有两个操作是主要的——map和flatmap。这两个操作都是在当前的值不为空的情况下才会执行的。其中map对值普通的映射,而flatmap则将返回的Optional替换为当前的Optional。如果读者熟悉js的promise,可以认为then方法同时包含了map和flatmap。
根据flatmap的特性,在Optional上,可以认为其用于连接两个可能“失败”的操作——比如上面的getMaybe。
比如你要从身份证号获得银行卡号,再从银行卡号获得对应的余额,假设两次操作都是从一个哈希表中获取,则每次都可能取得空值,即“失败”,即这个身份证号没有对应的银行卡号,这个银行卡号没有对应的余额(?直接理解成挂失,冻结之类的情况吧w),这时候你就可以使用flatmap——在代码逻辑中不需要关心两个操作是否失败便可以将其相连接。
从函数类型上来说会更加清晰,比如通过身份证号获得银行卡号,可以认为这个操作的类型签名为IdCard -> Optional<CreditCard>,通过银行卡号获得余额的操作为CreditCard -> Optional<Money>,这时候使用flatmap,我们就能够组合这两个操作,得到IdCard -> Optional<Money>,BINGO!
但是上面的代码同样存在一个问题——你容易预见组合后的操作的返回值是什么:如果身份证号和银行卡号均存在,则返回余额;若其中一个不存在,则返回空值。但预见这操作过程中会输出什么,或者说,这操作会对外界产生什么影响则是一个复杂问题。于是最简单的解决方案是:在操作中不要引发副作用,不要进行输出等操作。操作要尽量"纯"才好!