In the interests of helping to understand what a monad is, can someone provide an example using java ? Are they possible ?
Lambda expressions are possible using java
A diagram for the "Optional" Monad in Java.
Your task: Perform operations on the "Actuals" (left side) transforming elements of type T
union null
to type U
union null
using the function in the light blue box (the light blue box function). Just one box is shown here, but there may be a chain of the light blue boxes (thus proceeding from type U
union null
to type V
_union null
to type W
union null
etc.)
Practically, this will cause you to worry about null
values appearing in the function application chain. Ugly!
Solution: Wrap your T
into an Optional<T>
using the light green box functions, moving to the "Optionals" (right side). Here, transform elements of type Optional<T>
to type Optional<U>
using the red box function. Mirroring the application of functions to the "Actuals", there may be several red box functions to be be chained (thus proceeding from type Optional<U>
to Optional<V>
then to Optional<W>
etc.). In the end, move back from the "Optionals" to the "Actuals" through one of the dark green box functions.
No worrying about null
values anymore. Implementationwise, there will always be an Optional<U>
, which may or may not be empty. You can chain the calls to to the red box functions without null checks.
The key point: The red box functions are not implemented individually and directly. Instead, they are obtained from the blue box functions (whichever have been implemented and are available, generally the light blue ones) by using either the map
or the flatMap
higher-order functions.
The grey boxes provide additional support functionality.
Simples.
This blog post gives a step-by-step example of how you might implement a Monad type (interface) in Java and then use it to define the Maybe monad, as a practical application.
This post explains that there is one monad built into the Java language, emphasising the point that monads are more common than many programmers may think and that coders often inadvertently reinvent them.
Despite all controversy about Optional
satisfying, or not, the Monad laws, I usually like to look at Stream
, Optional
and CompletableFuture
in the same way. In truth, all them provide a flatMap()
and that is all I care and let me embrace the "the tasteful composition of side effects" (cited by Erik Meijer). So we may have corresponding Stream
, Optional
and CompletableFuture
in the following way:
Regarding Monads, I usually simplify it only thinking on flatMap()
(from "Principles of Reactive Programming" course by Erik Meijer):