Введение в Либо Вавра

Введение в Вавра

1. обзор

Vavr - это библиотека расширения объектно-функционального языка с открытым исходным кодом для Java 8+. Это помогает уменьшить объем кода и повысить надежность.

В этой статье мы узнаем об инструментеVavr под названиемEither.. Если вы хотите узнать больше о библиотекеVavr,check this article.

2. Что такоеEither?

В мире функционального программирования функциональныйvalues or objects не может быть изменен (т.е. вnormal form); в терминологии Java это переменныеimmutable.

Either представляет собой значение двух возможных типов данных. Either - это либоLeft, либоRight. По соглашению,Left означает результат отказа, аRight означает успех.

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.