Введение в Вавра
1. обзор
Vavr - это библиотека расширения объектно-функционального языка с открытым исходным кодом для Java 8+. Это помогает уменьшить объем кода и повысить надежность.
В этой статье мы узнаем об инструментеVavr под названиемEither.. Если вы хотите узнать больше о библиотекеVavr,check this article.
2. Что такоеEither?
В мире функционального программирования функциональныйvalues or objects не может быть изменен (т.е. вnormal form); в терминологии Java это переменныеimmutable.
3. Maven Зависимости
Нам нужно добавить следующую зависимость вpom.xml:
io.vavr
vavr
0.9.0
Последняя версияVavr доступна вCentral Maven Repository.
4. Случаи применения
Давайте рассмотрим вариант использования, когда нам нужно создать метод, который принимает входные данные, и на основе входных данных мы вернем либоString, либоInteger.
4.1. Обычная Ява
Мы можем реализовать это двумя способами. Либо наш метод может возвращать карту с ключом, представляющим результат успеха / неудачи, либо он может возвращать фиксированный размерList/Array, где позиция обозначает тип результата.
Вот как это может выглядеть:
public static Map computeWithoutEitherUsingMap(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. СEither
Теперь давайте посмотрим, как мы можем использовать утилитуVavr ’sEither для достижения того же результата:
private static Either computeWithEither(int marks) {
if (marks < 85) {
return Either.left("Marks not acceptable");
} else {
return Either.right(marks);
}
}
Нет, явное приведение типов, проверка нуля или создание неиспользуемых объектов не требуется.
Более того,Either предоставляет очень удобный монадический API для работы в обоих случаях:
computeWithEither(80)
.right()
.filter(...)
.map(...)
// ...
По соглашению, атрибутEither’s Left представляет случай сбоя, а атрибутRight - успех. Однако, исходя из наших потребностей, мы можем изменить это, используя прогнозы -Either вVavr не смещен в сторонуLeft илиRight..
Если мы проецируем наRight,, такие операции, какfilter(), map(), не будут иметь никакого эффекта, еслиEither был Осталось.
Например, давайте создадим проекциюRight и определим над ней некоторые операции:
computeWithEither(90).right()
.filter(...)
.map(...)
.getOrElse(Collections::emptyList);
Если окажется, что мы спроецировалиLeft наRight,, мы немедленно получим пустой список.
Аналогичным образом мы можем взаимодействовать с проекциейLeft:
computeWithEither(9).left()
.map(FetchError::getMsg)
.forEach(System.out::println);
4.3. Дополнительные возможности __
Доступно множество утилитEither; давайте посмотрим на некоторые из них.
Мы можем проверить, содержит лиEither толькоLeft илиRight, используя методыisLeft иisRight:
result.isLeft();
result.isRight();
Мы можем проверить, содержит лиEither заданное значениеRight:
result.contains(100)
Мы можемfold Left и Right к одному общему типу:
Either either = Either.right(42);
String result = either.fold(i -> i, Object::toString);
или ... даже обменяться сторонами:
Either either = Either.right(42);
Either swap = either.swap();
5. Заключение
В этом кратком руководстве мы узнали об использовании утилитыEither фреймворкаVavr. Более подробную информацию оEither можно найти вhere.
Как всегда, доступен полный исходный кодover on GitHub.