1. Обзор
Vavr — это библиотека расширения объектно-функционального языка с открытым исходным кодом для Java 8+. Это помогает уменьшить объем кода и повысить надежность.
В этой статье мы узнаем об инструменте Vavr
под названием « Либо».
Если вы хотите узнать больше о библиотеке Vavr ,
прочтите эту статью.
2. Что такое любой
?
В мире функционального программирования функциональные значения или объекты
не могут быть изменены (т.е. в нормальной форме ); в терминологии Java это известно как неизменяемые переменные.
Либо представляет значение двух возможных типов данных. Либо это либо Левый
,
либо Правый
. По соглашению, левое
значение означает неудачный результат, а правое
— успешное.
3. Зависимости Maven
Нам нужно добавить следующую зависимость в pom.xml
:
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.9.0</version>
</dependency>
Последняя версия Vavr
доступна в Центральном репозитории Maven .
4. Варианты использования
Давайте рассмотрим вариант использования, в котором нам нужно создать метод, который принимает входные данные и, на основе входных данных, возвращает либо String
, либо Integer
.
4.1. Обычная Java
Мы можем реализовать это двумя способами. Либо наш метод может возвращать карту с ключом, представляющим результат успеха/неудачи, либо он может возвращать список/массив
фиксированного размера, где позиция обозначает тип результата.
Вот как это может выглядеть:
public static Map<String, Object> computeWithoutEitherUsingMap(int marks) {
Map<String, Object> 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<String, Object> 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. С любым
Теперь давайте посмотрим, как мы можем использовать утилиту
Choose от Vavr
для достижения того же результата: ``
private static Either<String, Integer> computeWithEither(int marks) {
if (marks < 85) {
return Either.left("Marks not acceptable");
} else {
return Either.right(marks);
}
}
Нет, требуется явное приведение типов, проверка нулей или создание неиспользуемых объектов.
Более того, Либо
предоставляет очень удобный монадический API для работы в обоих случаях:
computeWithEither(80)
.right()
.filter(...)
.map(...)
// ...
По соглашению атрибут «Левый»
любого из них представляет случай сбоя, а атрибут « Правый»
— успех. Однако, исходя из наших потребностей, мы можем изменить это с помощью проекций — Либо
в Vavr
не смещается влево
или вправо.
Если мы спроецируем вправо,
такие операции, как filter(), map()
не будут иметь никакого эффекта, если в поле Both
было выбрано Left.
Например, создадим правую
проекцию и определим над ней некоторые операции:
computeWithEither(90).right()
.filter(...)
.map(...)
.getOrElse(Collections::emptyList);
Если окажется, что мы спроецировали слева
направо,
мы сразу получим пустой список.
Мы можем взаимодействовать с левой
проекцией аналогичным образом:
computeWithEither(9).left()
.map(FetchError::getMsg)
.forEach(System.out::println);
4.3. Дополнительные возможности ``
Доступно множество утилит Либо ;
давайте посмотрим на некоторые из них.
Мы можем проверить, содержит ли любой
из них только Left
или Right
, используя методы isLeft
и isRight
:
result.isLeft();
result.isRight();
Мы можем проверить, содержит ли Both заданное значение
Right
:
result.contains(100)
Мы можем сложить
Left и Right в один общий тип:
Either<String, Integer> either = Either.right(42);
String result = either.fold(i -> i, Object::toString);
или… даже поменяться местами:
Either<String, Integer> either = Either.right(42);
Either<Integer, String> swap = either.swap();
5. Вывод
В этом кратком руководстве мы узнали об использовании утилиты Choose из фреймворка
Vavr
. Более подробную информацию о Либо
можно найти здесь .
Как всегда, полный исходный код доступен на GitHub .