这个单词单子在提及或讨论功能编程时经常使用。 这个术语有几种解释,但是即使最简单的一种,也倾向于使用范畴论或至少依赖于基本的函数式编程背景来解释。
最近,我为自己发现,实际上不需要做的所有事情,仅使用Java程序员一定会熟悉的概念和概念,就可以向他们解释monad。 该解释并不假装是精确的或绝对正确的。 其目的是提供一般理解。
那么,什么是单子?
Monad是:
- 某些值的容器设计模式
我想“容器”部分很清楚。 因此,让我们进入“设计模式”部分。
与不可变的POJO相比,Monad是一种“控制反转”。 对于POJO,您可以调用getter来获取值并使用该值执行所需的操作。 POJO无法控制该用途。 对于monad,您提供“处理功能”并将其传递给某些monad方法。 然后,处理结果以某种形式返回给调用方。
这种反转为monad提供了如何执行处理的完全控制权,并实现了很多可能性。
例如,如果monad中存储的值实际上丢失了,它可以避免调用处理(也许单子)。
或仅在存储值是特定类型之一(要么monad),并省略其他处理,依此类推。
还要注意,Monad不会直接(也不通过getter)公开存储的值,在某些情况下这是不可能的。 这实现了一些实现,例如Java 8中引入的可选的不是完全单子。