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;