1. Обзор
Vavr -это библиотека расширений объектно-функционального языка с открытым исходным кодом для Java 8+. Это помогает уменьшить объем кода и повысить надежность.
В этой статье мы узнаем о Баре ‘табурет называется Либо. Если вы хотите узнать больше о библиотеке Var , ознакомьтесь с этой статьей.
2. Что Такое Либо?
В мире функционального программирования функциональные значения или объекты не могут быть изменены (т. Е. в нормальной форме ); в терминологии Java это известно как неизменяемые переменные.
Либо представляет значение двух возможных типов данных./| Либо является либо Левым , либо Правым . По соглашению, Left означает результат неудачного случая, а Right означает успех.
3. Зависимости Maven
Нам нужно добавить следующую зависимость в pom.xml :
io.vavr vavr 0.9.0
Последняя версия Var доступна в Центральном репозитории Maven .
4. Примеры использования
Давайте рассмотрим случай использования, когда нам нужно создать метод, который принимает входные данные, и на основе входных данных мы вернем либо Строку , либо Целое число .
4.1. Обычная Java
Мы можем реализовать это двумя способами. Либо наш метод может возвращать карту с ключом, представляющим результат успеха/неудачи, либо он может возвращать фиксированный размер Список/Массив , где позиция обозначает тип результата.
Вот как это может выглядеть:
public static MapcomputeWithoutEitherUsingMap(int marks) { Map results = new HashMap<>(); if (marks < 85) { results.put("FAILURE", "Marks not acceptable"); } else { results.put("SUCCESS", marks); } return results; } public static void main(String[] args) { Map results = computeWithoutEitherUsingMap(8); String error = (String) results.get("FAILURE"); int marks = (int) results.get("SUCCESS"); }
Для второго подхода мы могли бы использовать следующий код:
public static Object[] computeWithoutEitherUsingArray(int marks) { Object[] results = new Object[2]; if (marks < 85) { results[0] = "Marks not acceptable"; } else { results[1] = marks; } return results; }
Как мы видим, оба способа требуют довольно большой работы, и конечный результат не очень эстетичен и безопасен в использовании.
4.2. С Любым
Теперь давайте посмотрим, как мы можем использовать Var ‘s Либо утилиту для достижения того же результата:
private static EithercomputeWithEither(int marks) { if (marks < 85) { return Either.left("Marks not acceptable"); } else { return Either.right(marks); } }
Нет, требуется явное приведение типов, проверка на нуль или создание неиспользуемого объекта.
Более того, Либо предоставляет очень удобный монадический API для работы с обоими случаями:
computeWithEither(80) .right() .filter(...) .map(...) // ...
По соглашению, Либо левый атрибут представляет случай сбоя, а Правый – успех. Однако, исходя из наших потребностей, мы можем изменить это с помощью проекций – Либо в Вавр не смещен в сторону Влево или Вправо.
Если мы проецируем Вправо, операции, такие как filter (), map () , не будут иметь никакого эффекта, если Либо был Слева.
Например, давайте создадим проекцию Right и определим некоторые операции над ней:
computeWithEither(90).right() .filter(...) .map(...) .getOrElse(Collections::emptyList);
Если окажется, что мы спроецировали Влево Вправо, мы сразу получим пустой список.
Мы можем взаимодействовать с Левой проекцией аналогичным образом:
computeWithEither(9).left() .map(FetchError::getMsg) .forEach(System.out::println);
4.3. Дополнительные функции
Существует множество Либо доступных утилит; давайте взглянем на некоторые из них.
Мы можем проверить, содержит ли Либо только Левый или Правый , используя isLeft и isRight методы:
result.isLeft(); result.isRight();
Мы можем проверить, содержит ли Либо заданное Правильное значение:
result.contains(100)
Мы можем сложить Влево и вправо до одного общего типа:
Eithereither = Either.right(42); String result = either.fold(i -> i, Object::toString);
или… даже поменяться сторонами:
Eithereither = Either.right(42); Either swap = either.swap();
5. Заключение
В этом кратком руководстве мы узнали об использовании утилиты Either фреймворка Var . Более подробную информацию о Либо можно найти здесь .
Как всегда, полный исходный код доступен на GitHub .