Метод takeWhile
Метод takeWhile класса Stream возвращает
новый поток, который содержит элементы исходного
потока до тех пор, пока они удовлетворяют заданному
условию. Как только встречается первый элемент,
не удовлетворяющий условию, поток завершается,
и все последующие элементы отбрасываются.
В параметр метода мы передаем предикат -
функцию, которая принимает элемент и возвращает
boolean. Метод является ленивой
промежуточной операцией.
Синтаксис
Stream<T> takeWhile(Predicate<? super T> predicate)
Пример
Давайте возьмем из потока числа до первого,
которое не меньше 3:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Stream<Integer> res = list.stream()
.takeWhile(n -> n < 3);
System.out.println(res.toList());
}
}
Результат выполнения кода:
[1, 2]
Пример
Давайте возьмем строки из потока до первой,
длина которой меньше 3:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "12345", "ab", "cde");
Stream<String> res = list.stream()
.takeWhile(s -> s.length() >= 3);
System.out.println(res.toList());
}
}
Результат выполнения кода:
[abcde, 12345]
Пример
Важно понимать, что метод останавливается
на первом элементе, не прошедшем проверку,
даже если дальше снова есть подходящие элементы.
В следующем примере первые три числа меньше 3,
но четвертое число 5 прерывает поток,
и последнее число 2 уже не попадает в результат:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 5, 2);
Stream<Integer> res = list.stream()
.takeWhile(n -> n < 4);
System.out.println(res.toList());
}
}
Результат выполнения кода:
[1, 2, 3]