Метод generate
Метод generate класса Stream создает
бесконечный последовательный поток, элементы
которого вычисляются переданным Supplier.
В первый параметр мы передаем функцию-поставщик,
которая не принимает аргументов и возвращает
очередной элемент потока. Метод возвращает новый
поток типа Stream<T>. Поскольку поток
бесконечный, его обязательно нужно ограничивать
с помощью limit или другого промежуточного
оператора.
Синтаксис
Stream.generate(Supplier<T> supplier)
Пример
Давайте создадим поток из пяти одинаковых элементов и соберем его в список:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
List<String> res = Stream.generate(() -> "abcde")
.limit(5)
.toList();
System.out.println(res);
}
}
Результат выполнения кода:
["abcde", "abcde", "abcde", "abcde", "abcde"]
Пример
Давайте создадим поток из случайных чисел и ограничим его тремя элементами:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
List<Double> res = Stream.generate(Math::random)
.limit(3)
.toList();
System.out.println(res);
}
}
Результат выполнения кода:
[0.123456789, 0.987654321, 0.456789123]
Пример
Давайте создадим поток из натуральных чисел, используя изменяемую переменную во внешней лямбде:
import java.util.List;
import java.util.stream.Stream;
public class Main
{
public static void main(String[] args)
{
int[] counter = {1};
List<Integer> res = Stream.generate(() -> counter[0]++)
.limit(5)
.toList();
System.out.println(res);
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5]