Учебники

Java 9 — Улучшения потокового API

Потоки были введены в Java, чтобы помочь разработчикам выполнять агрегатные операции из последовательности объектов. В Java 9 добавлено еще несколько методов для улучшения потоков.

takeWhile (интерфейс предиката)

Синтаксис

default Stream<T> takeWhile(Predicate<? super T> predicate)

Метод takeWhile принимает все значения, пока предикат не вернет false. В случае упорядоченного потока он возвращает поток, состоящий из самого длинного префикса элементов, взятых из этого потока, соответствующих данному предикату.

пример

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty())
         .forEach(System.out::print);		 
   } 
}

Выход

Метод takeWhile принимает все значения a, b и c, затем, когда строка пуста, выполнение прекращается.

abc

dropWhile (интерфейс предиката)

Синтаксис

default Stream<T> dropWhile(Predicate<? super T> predicate)

Метод dropWhile отбрасывает все значения в начале, пока предикат не вернет true. В случае упорядоченного потока он возвращает поток, состоящий из оставшихся элементов этого потока, после удаления самого длинного префикса элементов, соответствующих данному предикату.

пример

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
         .forEach(System.out::print);
      
      System.out.println();
      Stream.of("a","b","c","","e","","f").dropWhile(s-> !s.isEmpty())
         .forEach(System.out::print);
   } 
}

Выход

Метод dropWhile сбрасывает значения a, b и c, затем, когда строка пуста, она принимает все значения.

ef
ef

повторять

Синтаксис

static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

Метод iterate теперь имеет предикат hasNext в качестве параметра, который останавливает цикл, когда предикат hasNext возвращает false.

пример

import java.util.stream.IntStream;

public class Tester {
   public static void main(String[] args) {
      IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);
   } 
}

Выход

3
6
9

ofNullable

Синтаксис

static <T> Stream<T> ofNullable(T t)

Метод ofNullable введен, чтобы предотвратить исключения NullPointerException и избежать нулевых проверок для потоков. Этот метод возвращает последовательный поток, содержащий один элемент, если он не равен нулю, в противном случае возвращает пустой поток.