Метод iterate
Метод iterate создает поток, начиная с
некоторого начального значения, и последовательно
применяет к нему заданную функцию для получения
следующих элементов. Первым параметром метод
принимает начальное значение (seed), вторым -
функцию (UnaryOperator), которая преобразует
предыдущий элемент в следующий. Существует
перегрузка, которая третьим параметром принимает
предикат (Predicate) для ограничения длины потока.
Если использовать версию с двумя параметрами,
поток будет бесконечным, поэтому его необходимо
ограничивать с помощью limit или
takeWhile.
Синтаксис
Stream.iterate(seed, function)
Stream.iterate(seed, predicate, function)
Пример
Давайте создадим бесконечный поток чисел, начиная
с 1, где каждое следующее число
увеличивается на 2, и ограничим его
пятью элементами:
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
Stream<Integer> stream = Stream.iterate(1, n -> n + 2);
stream.limit(5).forEach(System.out::println);
}
}
Результат выполнения кода:
1
3
5
7
9
Пример
Давайте используем перегрузку с тремя параметрами,
чтобы ограничить поток числами меньше 20:
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
Stream<Integer> stream = Stream.iterate(
1,
n -> n < 20,
n -> n + 2
);
stream.forEach(System.out::println);
}
}
Результат выполнения кода:
1
3
5
7
9
11
13
15
17
19
Пример
Давайте создадим поток строк, начиная с
"a", где каждый следующий элемент
добавляет символ "b", и соберем
результат в список:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
List<String> res = Stream.iterate("a", s -> s + "b")
.limit(4)
.toList();
System.out.println(res);
}
}
Результат выполнения кода:
[a, ab, abb, abbb]