Потоки Java 20. AnyMatch, allMatch или noneMatch

Терминальные операции либо возвращают значения (того же или другого типа), либо вообще ничего не возвращают (вызывают только побочные эффекты). Они не позволяют применять другие операции и закрывают поток.

Сегодня мы рассмотрим три терминальные операции, каждая из которых возвращает логическое значение:

boolean allMatch(Predicate‹T› предикат). Возвращает true, если предоставленная функция Predicate‹T› возвращает true при применении к каждому из элементов, созданных Stream. > объект. В противном случае возвращает false, если один из элементов дает false при использовании в качестве входных данных для предоставленной функции Predicate‹T›.

boolean anyMatch(Predicate‹T› предикат). Возвращает true, если предоставленная функция Predicate‹T› возвращает true при применении к одному из элементов, созданных Stream. > объект. В противном случае возвращает false, если каждый из элементов дает false при использовании в качестве входных данных для предоставленной функции Predicate‹T›.

boolean noneMatch(Predicate‹T› предикат). Возвращает true, если предоставленная функция Predicate‹T› возвращает false при применении к каждому из элементов, созданных Stream. > объект. В противном случае возвращается false, если один из элементов возвращает значение true при использовании в качестве входных данных для предоставленной функции Predicate‹T›.

Вот примеры использования этих операций:

  List<String> list = List.of("1", "2", "3", "4", "5");
  boolean found = list.stream()
        .peek(System.out::print)          //prints: 1
        .allMatch(e -> "3".equals(e));
  System.out.println("\n" + found);       //prints: false
  boolean found = list.stream()
        .peek(System.out::print)          //prints: 123
        .anyMatch(e -> "3".equals(e));
  System.out.println("\n" + found);       //prints: true
  boolean found = list.stream()
        .peek(System.out::print)          //prints: 123
        .noneMatch(e -> "3".equals(e));
  System.out.println("\n" + found);       //prints: false

Как вы, наверное, заметили, эти операции оптимизированы таким образом, чтобы не обрабатывать все элементы потока, а возвращать результат, как только он может быть определен.

В следующем посте, прежде чем представить следующую группу операций терминал, мы обсудим класс Optional‹T›, который используется как возвращаемое значение некоторых операций .

Смотрите другие сообщения о потоках Java 8 и сообщения на другие темы.