Серия Java9, часть 7: оптимизация и улучшение Java.util.Optional

Spring Boot Java Spring

В ближайшее время я планирую написать серию статей о java 9. Хотя java 9 не является основной версией java, как Java 8 или Java 11, все же есть много функций, на которые стоит обратить внимание. Жду ваших подписок.Ява 9 напишу в серию статей,около десяти статей.Эта статья седьмая статья.

java.util.OptionalЭто новый класс в версии Java 8, который может в определенной степени решить проблему NullPointException в процессе программирования. В Java 9 к этому классу были добавлены некоторые методы для улучшения, давайте взглянем на него вместе и, кстати, рассмотрим его использование в Java 8.

1. ifPresentOrElse в Java9 (потребитель, исполняемый)

1.1 Улучшения в Java 9

Этот новый метод выполнит данное действие Consumer, если присутствует значение, в противном случае запустит данное действие Runnable. Следующий код сначала использует поток Java 8 для фильтрации кратных 3, а затем находит первое кратное 3 с помощью findFirst. Если такое значение найдено, выведите его в консоль, если такого значения не найдено, выведите «Не найдено кратное 3»

Семантику ifPresentOrElse(Consumer, Runnable) можно интерпретировать следующим образом: ifPresent — это Consumer, OrElse — это Runnable. Это усовершенствование только для Java 9.

 IntStream.of(1, 2, 4)
          .filter(i -> i % 3 == 0)
          .findFirst()
          .ifPresentOrElse(System.out::println, () -> {  
              System.out.println("没有找到3的倍数");
          });

В числах 1, 2 и 4 нет кратных 3, поэтому вывод выглядит следующим образом.

没有找到3的倍数

Если был отфильтрован следующий массив 2,6,8, окончательный вывод консоли: 6

 IntStream.of(2, 6, 8)
          .filter(i -> i % 3 == 0)
          .findFirst()
          .ifPresentOrElse(System.out::println, () -> {
              System.out.println("没有找到3的倍数");
          });   // 6

1.2 Просмотрите написанное на Java 8

Java 8 Optional.isPresent():

При использовании Java 8 нетifPresentOrElse(Consumer,Runnable)метод, вы должны написать тот же код, что и выше: пишите if и else, судите сами. Тот же вывод: не найдено число, кратное 3

 OptionalInt opt = IntStream.of(1, 2, 4)
                            .filter(i -> i % 3 == 0)
                            .findFirst();
 if (opt.isPresent()) {
     System.out.println(opt.getAsInt());
 } else {
     System.out.println("没有找到3的倍数");
 }

Java 8 Optional.ifPresent():

ifPresent()Метод не предоставляет необязательное действие, когда значение не существует. Таким образом, после выполнения следующего кода нет действия orElse и вывода, что не очень удобно.

 IntStream.of(1, 2, 4)
          .filter(i -> i % 3 == 0)
          .findFirst()
          .ifPresent(System.out::println);

Java 8 Optional.orElse():

orElse()Метод дает значение по умолчанию после того, как значение возвращает пустое значение. Значение по умолчанию -1 указано в приведенном ниже коде.

 int result = IntStream.of(1, 2, 4)
                       .filter(i -> i % 3 == 0)
                       .findFirst()
                       .orElse(-1);
 System.out.println(result);   //-1

2. Необязательный.или(Поставщик) Java9

Этот метод создает новый необязательный элемент, если значение не найдено. Следующий код фильтрует массив ['a', 'b', 'c'], isDigit судит, есть ли в массиве числовые символы, очевидно, что нет, поэтому findFirst не может найти такое значение. Итак, сгенерируйте значение по умолчанию:Optional.of('0')

 char digit = Stream.of('a', 'b', 'c')
                    .filter(e -> Character.isDigit(e))
                    .findFirst()
                    .or(() -> Optional.of('0')).get();
 System.out.println(digit);   //0

orElseGet() в Java8

в Яве 8Optional.orElseGet()Методы также имеют ту же функцию. Следующий код фильтрует массив ['a', 'b', 'c'], isDigit судит, есть ли в массиве числовые символы, очевидно, что нет, поэтому findFirst не может найти такое значение. Итак, получите значение по умолчанию через orElseGet:'0'

 char result = Stream.of('a', 'b', 'c')
                    .filter(c -> Character.isDigit(c))
                    .findFirst()
                    .orElseGet(()->'0');
 System.out.println(result);   //0

3. Необязательный.stream() из Java9

В таком случаеOptional.stream()Метод возвращает максимальный поток содержит только один элемент потока. Если значение не существует, то верните нужный поток:

 OptionalInt opt1 = IntStream.of(2, 5, 6).max();  //求最大值
 OptionalInt opt2 = IntStream.of(1, 3, 7).max();  //求最大值
 IntStream.concat(opt1.stream(), opt2.stream())  //将2个流合并
          .forEach(System.out::println);   //将合并后的流数据打印

Результат вывода консоли выглядит следующим образом:

 6
 7

Добро пожаловать, чтобы обратить внимание на мой блог, в нем много прекрасных коллекций

  • Эта статья воспроизводится с указанием источника (должна быть ссылка, а не только текст):Блог Адетокунбо.

Если вы считаете это полезным, пожалуйста, поставьте лайк и поделитесь! Ваша поддержка - моя неиссякаемая творческая мотивация!. Кроме того, автор недавно выпустил следующий прекрасный контент, с нетерпением жду вашего внимания.