Jan*_*rek 39 java java-8 java-stream
在Java中,可以轻松地生成无限流Stream.generate(supplier).但是,我需要生成一个最终完成的流.
想象一下,例如,我想要一个目录中所有文件的流.文件数量可能很大,因此我无法预先收集所有数据并从中创建流(via 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);
Run Code Online (Sandbox Code Playgroud)
我刚看了一下java.nio.file.Files,该list(path)方法是如何实现的.
the*_*472 17
有没有合理的简单方法在Java中执行此操作,而不是自己实现整个Stream接口?
一个简单的.limit()保证它将终止.但这并不总是足够强大.
在Stream工厂方法之后,创建海关流源而不重新实现流处理管道的最简单方法是子类化java.util.Spliterators.AbstractSpliterator<T>并将其传递给java.util.stream.StreamSupport.stream(Supplier<? extends Spliterator<T>>, int, boolean)
如果您打算使用并行流,请注意AbstractSpliterator只会产生次优分裂.如果您对源有更多控制权,那么完全实现Spliterator接口可以更好.
例如,以下代码段将创建一个提供无限序列1,2,3的流...
在那个特定的例子中你可以使用 IntStream.range()
但是流显然会在某个时刻完成,终端运营商喜欢(collect()或findAny())需要处理它.
findAny()只要有任何匹配的元素,短路操作就像实际上可以在无限流上完成一样.
Java 9引入了Stream.iterate来为一些简单的情况生成有限流.
| 归档时间: |
|
| 查看次数: |
6954 次 |
| 最近记录: |