Рубрики
Без рубрики

Знакомство с творчеством Вавра

Быстрый и практический пример использования любого из Var в Java.

Автор оригинала: baeldung.

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 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. С Любым

Теперь давайте посмотрим, как мы можем использовать Var ‘s Либо утилиту для достижения того же результата:

private static Either computeWithEither(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)

Мы можем сложить Влево и вправо до одного общего типа:

Either either = Either.right(42);
String result = either.fold(i -> i, Object::toString);

или… даже поменяться сторонами:

Either either = Either.right(42);
Either swap = either.swap();

5. Заключение

В этом кратком руководстве мы узнали об использовании утилиты Either фреймворка Var . Более подробную информацию о Либо можно найти здесь .

Как всегда, полный исходный код доступен на GitHub .