Monad in Java(

這種代碼無論是可讀性還是性能都是災(zāi)難,但是有趣 (以及研究價(jià)值)最重要!Just for fun :)
對Optional,其有兩個(gè)操作是主要的——map和flatmap。這兩個(gè)操作都是在當(dāng)前的值不為空的情況下才會(huì)執(zhí)行的。其中map對值普通的映射,而flatmap則將返回的Optional替換為當(dāng)前的Optional。如果讀者熟悉js的promise,可以認(rèn)為then方法同時(shí)包含了map和flatmap。
根據(jù)flatmap的特性,在Optional上,可以認(rèn)為其用于連接兩個(gè)可能“失敗”的操作——比如上面的getMaybe。
比如你要從身份證號獲得銀行卡號,再從銀行卡號獲得對應(yīng)的余額,假設(shè)兩次操作都是從一個(gè)哈希表中獲取,則每次都可能取得空值,即“失敗”,即這個(gè)身份證號沒有對應(yīng)的銀行卡號,這個(gè)銀行卡號沒有對應(yīng)的余額(?直接理解成掛失,凍結(jié)之類的情況吧w),這時(shí)候你就可以使用flatmap——在代碼邏輯中不需要關(guān)心兩個(gè)操作是否失敗便可以將其相連接。
從函數(shù)類型上來說會(huì)更加清晰,比如通過身份證號獲得銀行卡號,可以認(rèn)為這個(gè)操作的類型簽名為IdCard -> Optional<CreditCard>,通過銀行卡號獲得余額的操作為CreditCard -> Optional<Money>,這時(shí)候使用flatmap,我們就能夠組合這兩個(gè)操作,得到IdCard -> Optional<Money>,BINGO!
但是上面的代碼同樣存在一個(gè)問題——你容易預(yù)見組合后的操作的返回值是什么:如果身份證號和銀行卡號均存在,則返回余額;若其中一個(gè)不存在,則返回空值。但預(yù)見這操作過程中會(huì)輸出什么,或者說,這操作會(huì)對外界產(chǎn)生什么影響則是一個(gè)復(fù)雜問題。于是最簡單的解決方案是:在操作中不要引發(fā)副作用,不要進(jìn)行輸出等操作。操作要盡量"純"才好!