В языках программирования монады представляют собой абстракцию, которая позволяет выстраивать цепочки последовательных вычислений.
Монады больше связаны с функциональным программированием. Представляйте их как некий контейнер, который принимает текущее состояние и функцию, которая принимает в качестве аргумента текущее состояние и возвращает новое.
Да, сейчас функциональное программирование снова в моде. Именно поэтому во всех языках появляются подобные конструкции. А ведь первоначально Java создавалась совершенно другой. Она планировалась как строгий ООП язык, и никаких монад там совсем не планировалось…
Предыдущими абзацами я, скорее всего, только запутал вас. Давайте обратим наш взор на примеры монад в Java.
java.util.Optional
В Java Optional — это самая что ни на есть монада. Посмотрите на пример кода:
1 2 |
return Optional.ofNullable(param).map(m -> m.get("v1")) .map(m -> m.get("v2")).orElse("no"); |
Обратите внимание на выстроенную цепочку вычислений. Монады — это то, что вы здесь видите.
java.util.stream
Stream API — это тоже пример монад. Более подробно я их уже расписывал в статье про коллекции. Здесь же просто приведу пример использования:
1 2 3 4 |
roster .stream() .filter(e -> e.getGender() == Person.Sex.MALE) .forEach(e -> System.out.println(e.getName())); |
Обратите внимание на цепочку вычислений, которая очень похожа на выстраивание цепочки в случае с Optional.