Java 8 供应商<;溪流>;生成空流,但作为列表,它';它不是空的
在我的代码中,我必须多次迭代一组类型为Java 8 供应商<;溪流>;生成空流,但作为列表,它';它不是空的,java-8,java-stream,Java 8,Java Stream,在我的代码中,我必须多次迭代一组类型为T的对象。由于一些对象可能相当大,我求助于使用流的供应商,而不是将它们全部收集到一个列表或集合中。方法如下: private static Supplier<Stream<T>> streamSupplier(...) { Iterator<T> iterator = ...; Iterable<T> iterable = () -> iterator; return () -&g
T
的对象。由于一些对象可能相当大,我求助于使用流的供应商,而不是将它们全部收集到一个列表或集合中。方法如下:
private static Supplier<Stream<T>> streamSupplier(...) {
Iterator<T> iterator = ...;
Iterable<T> iterable = () -> iterator;
return () -> StreamSupport.stream(iterable.spliterator(), false);
}
我认为如果我想重复使用一个流(这样我就不会得到一个封闭的“流”),使用供应商
是正确的方法。我做错了什么?看起来您试图从同一迭代器创建多个流
试试这个:
Iterable<Document> docIterable = () -> ...;
Iterable-docIterable=()->。。。;
其中,…
来自迭代器docIterator=代码>
另外,为什么您要返回一个供应商
,而不是只返回流
?您可能希望执行以下操作:
private static Supplier<Stream<T>> streamSupplier(...) {
return () -> {
Iterator<T> iterator = ...;
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
};
}
私有静态供应商streamSupplier(…){
返回()->{
迭代器迭代器=。。。;
返回StreamSupport.stream(Spliterators.spliteratorUnknownSize(迭代器,0),false);
};
}
这假定
Iterator<T> iterator = ...;
Iterator迭代器=。。。;
每次创建一个新的迭代器,独立于任何现有迭代器
还请注意,您应该调整拆分器的创建方式,例如,如果大小已知,或者如果存在重要的特征(如排序)
最后,要非常小心
Iterable<T> iterable = () -> iterator;
Iterable Iterable=()->迭代器;
这几乎是一种反模式。虽然它在类型系统中工作——调用生成的Iterable的iterator()方法将返回iterator的实例——但它通常不会工作。原因是大多数使用Iterable实例的代码都假设它可以多次调用iterator()并获得独立的迭代器。这并不能做到这一点;它捕获迭代器并每次返回相同的迭代器实例。这将导致奇怪的断裂,就像你看到的一样。我也认为这就是原因。但是,至少第一次调用应该返回一个非空流,对吗?此外,在我的情况下,返回供应商相当于返回流,不是吗?我所做的只是对供应商调用get()
,而不是调用实际遍历文档的方法。请创建一个。您正试图让一个不必要的脆弱设计发挥作用,如果看不到代码的其余部分,就很难判断问题出在哪里。请发布迭代器
实现。
Iterator<T> iterator = ...;
Iterable<T> iterable = () -> iterator;