В Java можно легко создать бесконечный поток с Stream.generate(supplier)
. Тем не менее, мне нужно будет создать поток, который в конечном итоге закончится.
Представьте, например, что я хочу поток всех файлов в каталоге. Количество файлов может быть огромным, поэтому я не могу собрать все данные заранее и создать поток из них (через collection.stream()
). Мне нужно сгенерировать последовательность по частям. Но в какой-то момент поток, очевидно, завершится, и терминальные операторы, такие как (collect()
или findAny()
), должны работать над ним, поэтому Stream.generate(supplier)
здесь не подходит.
Есть ли разумный простой способ сделать это в Java, не реализуя весь интерфейс Stream самостоятельно?
Я могу думать о простом взломе - делать это с бесконечным Stream.generate(supplier)
и предоставлять null или бросать исключение, когда принимаются все фактические значения. Но это нарушит стандартные потоковые операторы, я могу использовать его только с моими собственными операторами, которые знают об этом поведении.
РАЗЪЯСНЕНИЕ
Люди в комментариях предлагают мне оператор takeWhile()
. Это не то, что я имел в виду. Как лучше сформулировать вопрос... Я не спрашиваю, как фильтровать (или ограничивать) существующий поток, я спрашиваю, как создавать (генерировать) поток - динамически, без загрузки всех элементов вверх, но поток будет иметь конечный размер (неизвестно заранее).
Решение
Код, который я искал,
Iterator it = myCustomIteratorThatGeneratesTheSequence();
StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.DISTINCT), false);
Я просто просмотрел java.nio.file.Files
, как реализуется метод list(path)
.