Pascal4eg

 Java | Фишки и трюки

Бесконечные потоки

Stream infiniteStream = Stream.iterate(0, i -> i + 2);
List intList = infiniteStream
                        .limit(10)
                        .collect(Collectors.toList());
// 0, 2, 4, 6, 8, 10, 12, 14, 16, 18

Supplier randomUUIDSupplier = UUID::randomUUID;
Stream infiniteUUIDStream = Stream.generate(randomUUIDSupplier);
List uuidList = infiniteUUIDStream
                        .skip(10) // пропустить первые 10
                        .limit(10)
                        .collect(Collectors.toList());

Интерфейс Stream имеет два статических метода для генерации бесконечных потоков: iterate() и generate().

iterate(final T seed, final UnaryOperator f) возвращает бесконечный последовательный упорядоченный поток, созданный путем итеративного применения функции f к исходному элементу начального значения, создавая поток, состоящий из начального числа, f(начальное число), f(f(начальное число)) и т. д.

generate(Supplier s) возвращает бесконечный последовательный неупорядоченный поток, в котором каждый элемент создается предоставленным поставщиком (Supplier). Это подходит для генерации константных потоков, потоков случайных элементов и т. д.

📌 При работе с бесконечными потоками, крайне важно вызвать метод limit() перед вызовом терминальной операции, иначе наша программа будет работать бесконечно.