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

Java 9 Дополнительные дополнения API

Быстрые и практические примеры новых методов в необязательном API в Java.

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

1. Обзор

В этой статье мы рассмотрим дополнения Java 9 к Необязательному |/API.

Помимо модульности, Java 9 также добавляет три очень полезных метода для класса Optional .

2. Метод or()

Иногда, когда наш Необязательный пуст, мы хотим выполнить какое-то другое действие, которое также возвращает O ptional.

До Java 9 класс Optional имел только методы or Else() и orElseGet () , но оба должны возвращать развернутые значения.

Java 9 вводит метод или() , который возвращает другой Необязательный лениво, если наш Необязательный пуст. Если наш первый Необязательный имеет определенное значение, лямбда, переданная методу или () , не будет вызвана, а значение не будет вычислено и возвращено:

@Test
public void givenOptional_whenPresent_thenShouldTakeAValueFromIt() {
    //given
    String expected = "properValue";
    Optional value = Optional.of(expected);
    Optional defaultValue = Optional.of("default");

    //when
    Optional result = value.or(() -> defaultValue);

    //then
    assertThat(result.get()).isEqualTo(expected);
}

В случае Необязательного bei ng пустого, возвращаемый результат будет таким же, как значение по умолчанию:

@Test
public void givenOptional_whenEmpty_thenShouldTakeAValueFromOr() {
    // given
    String defaultString = "default";
    Optional value = Optional.empty();
    Optional defaultValue = Optional.of(defaultString);

    // when
    Optional result = value.or(() -> defaultValue);

    // then
    assertThat(result.get()).isEqualTo(defaultString);
}

3. Метод ifPresentOrElse()

Когда у нас есть Необязательный экземпляр, часто мы хотим выполнить определенное действие над его базовым значением. С другой стороны, если Необязательный является пустым , мы хотим зарегистрировать его или отследить этот факт, увеличив какую-либо метрику.

Метод ifPresentOrElse() создан именно для таких сценариев. Мы можем передать Consumer , который будет вызван, если Необязательный определен, и Runnable , который будет выполнен, если Необязательный пуст.

Допустим, у нас есть определенный Необязательный , и мы хотим увеличить определенный счетчик, если значение присутствует:

@Test
public void givenOptional_whenPresent_thenShouldExecuteProperCallback() {
    // given
    Optional value = Optional.of("properValue");
    AtomicInteger successCounter = new AtomicInteger(0);
    AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0);

    // when
    value.ifPresentOrElse(
      v -> successCounter.incrementAndGet(), 
      onEmptyOptionalCounter::incrementAndGet);

    // then
    assertThat(successCounter.get()).isEqualTo(1);
    assertThat(onEmptyOptionalCounter.get()).isEqualTo(0);
}

Обратите внимание, что обратный вызов, переданный в качестве второго аргумента, не был выполнен.

В случае пустого Необязательного выполняется второй обратный вызов:

@Test
public void givenOptional_whenNotPresent_thenShouldExecuteProperCallback() {
    // given
    Optional value = Optional.empty();
    AtomicInteger successCounter = new AtomicInteger(0);
    AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0);

    // when
    value.ifPresentOrElse(
      v -> successCounter.incrementAndGet(), 
      onEmptyOptionalCounter::incrementAndGet);

    // then
    assertThat(successCounter.get()).isEqualTo(0);
    assertThat(onEmptyOptionalCounter.get()).isEqualTo(1);
}

4. Метод stream()

Последний метод, который добавляется в класс Optional в Java 9, – это метод stream () .

Java имеет очень плавный и элегантный API Stream , который может работать с коллекциями и использует множество функциональных концепций программирования. Новейшая версия Java представляет метод stream() в классе Optional , который позволяет нам рассматривать экземпляр Optional как Поток.

Допустим, у нас есть определенный Необязательный , и мы вызываем на нем метод stream () . Это создаст Поток одного элемента, на котором мы сможем использовать все методы, доступные в потоке API :

@Test
public void givenOptionalOfSome_whenToStream_thenShouldTreatItAsOneElementStream() {
    // given
    Optional value = Optional.of("a");

    // when
    List collect = value.stream().map(String::toUpperCase).collect(Collectors.toList());

    // then
    assertThat(collect).hasSameElementsAs(List.of("A"));
}

С другой стороны, если Необязательный отсутствует, вызов метода stream() на нем создаст пустой поток:

@Test
public void givenOptionalOfNone_whenToStream_thenShouldTreatItAsZeroElementStream() {
    // given
    Optional value = Optional.empty();

    // when
    List collect = value.stream()
      .map(String::toUpperCase)
      .collect(Collectors.toList());

    // then
    assertThat(collect).isEmpty();
}

Теперь мы можем быстро фильтровать потоки необязательных.

Работа с пустым потоком не будет иметь никакого эффекта, но благодаря методу stream() теперь мы можем связать Необязательный API с Stream API. Это позволяет нам создавать более элегантный и плавный код.

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

В этой краткой статье мы рассмотрели дополнения Java 9 Optional API.

Мы видели, как использовать метод или() для возврата необязательного значения в случае, если источник Необязательный пуст. Мы использовали ifPresentOrElse() для выполнения Consumer , если значение присутствует, и в противном случае запустите другой обратный вызов.

Наконец, мы увидели, как связать Необязательный с Stream API с помощью метода stream () .

Реализацию всех этих примеров и фрагментов кода можно найти в проекте GitHub – это проект Maven, поэтому его должно быть легко импортировать и запускать как есть.