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"; Optionalvalue = 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"; Optionalvalue = 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 Optionalvalue = 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 Optionalvalue = 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 Optionalvalue = 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 Optionalvalue = 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, поэтому его должно быть легко импортировать и запускать как есть.