gpt4 book ai didi

java-8 - 流如何停止?

转载 作者:行者123 更新时间:2023-12-03 15:26:53 24 4
gpt4 key购买 nike

我想知道我何时使用 Stream.generate 创建了自己的无限流标准库中的 Streams 如何停止...

例如,当您有一个包含记录的列表时:

List<Record> records = getListWithRecords();
records.stream().forEach(/* do something */);

流不会是无限的并且永远运行,但是当遍历列表中的所有项目时它会停止。但这是如何工作的?相同的功能适用于 Files.lines(path) 创建的流。 (来源: http://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/)。

第二个问题,如何使用 Stream.generate 创建流?以同样的方式停止呢?

最佳答案

有限流根本不是通过 Stream.generate 创建的。

实现流的标准方法是实现 Spliterator ,有时使用 the Iterator detour 。在任何一种情况下,实现都有一种方法来报告结束,例如当 Spliterator.tryAdvance 返回 false 或其 forEachRemaining 方法时返回,或者在 Iterator 源的情况下,当 hasNext() 返回 false 时。
Spliterator 甚至可以在处理开始之前报告预期的元素数量。

通过 Stream 接口(interface)内的工厂方法之一创建的流,例如 Stream.generate 也可以通过 Spliterator 或使用流实现的内部功能来实现,但无论它们如何实现,您都不会动手这个实现改变他们的行为,所以使这种流有限的唯一方法是将 limit 操作链接到流。

如果要创建一个非空的有限流,它不受数组或集合的支持,并且现有的流源都不适合,则必须实现自己的 Spliteratorcreate a stream out of it 。如上所述,您可以使用现有方法从 Spliterator 创建 Iterator ,但您应该抵制使用 Iterator 的诱惑,因为它很熟悉。 Spliterator 不难实现:

/** like {@code Stream.generate}, but with an intrinsic limit */
static <T> Stream<T> generate(Supplier<T> s, long count) {
return StreamSupport.stream(
new Spliterators.AbstractSpliterator<T>(count, Spliterator.SIZED) {
long remaining=count;

public boolean tryAdvance(Consumer<? super T> action) {
if(remaining<=0) return false;
remaining--;
action.accept(s.get());
return true;
}
}, false);
}

从这个起点开始,您可以为 default 接口(interface)的 Spliterator 方法添加覆盖,加权开发费用和潜在的性能改进,例如
static <T> Stream<T> generate(Supplier<T> s, long count) {
return StreamSupport.stream(
new Spliterators.AbstractSpliterator<T>(count, Spliterator.SIZED) {
long remaining=count;

public boolean tryAdvance(Consumer<? super T> action) {
if(remaining<=0) return false;
remaining--;
action.accept(s.get());
return true;
}

/** May improve the performance of most non-short-circuiting operations */
@Override
public void forEachRemaining(Consumer<? super T> action) {
long toGo=remaining;
remaining=0;
for(; toGo>0; toGo--) action.accept(s.get());
}
}, false);
}

关于java-8 - 流如何停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35226823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com