gpt4 book ai didi

java - 从 Java 8 流中获取下一个项目

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:05 25 4
gpt4 key购买 nike

我想从 Java 8 Stream 中检索并删除下一个项目,而不关闭此 Stream

Stream<Integer> integerStream = Stream.iterate( 0, x -> new Integer(x + 1) );
Integer zero = integerStream.getNext(); // 0
Integer one = integerStream.getNext(); // 1
...

这可能吗?

最佳答案

是的,有一种方法可以做到这一点,但有一些限制。

Stream<Integer> infiniteStream = Stream.iterate( 0, x -> new Integer(x + 1) );
Iterator<Integer> iter = infiniteStream.iterator();
Integer zero = iter.next();
Integer one = iter.next();

或者,

Stream<Integer> infiniteStream = Stream.iterate( 0, x -> new Integer(x + 1) );
Spliterator<Integer> spliterator = infiniteStream.spliterator();
spliterator.tryAdvance(i -> System.out.println(i)); // zero
spliterator.tryAdvance(i -> System.out.println(i)); // one

给定一个 Stream , 有可能得到 IteratorSpliterator从它,或查询它是否是并行流等。这些在 BaseStream 上定义接口(interface), Stream 的超接口(interface),这让它们有点容易被遗漏。

在这种情况下,我们知道流是无限的,因此无需调用 Iterator 的 hasNext()方法或检查 Spliterator 的 tryAdvance() 的返回值

限制是iterator()spliterator() Stream 的方法是终端操作,这意味着在调用它们之后,返回的 Iterator 或 Spliterator 可以独占访问 Stream 表示的值。不允许对流进行进一步的操作(例如 filtermap 等),并将遇到 IllegalStateException。 .

如果您想剥离前几个元素然后恢复流处理,您可以像这样将拆分器变回流:

Stream<Integer> stream2 = StreamSupport.stream(spliterator, false);

这对于某些事情可能会很好,但我不确定我是否会在一般情况下推荐这种技术。我认为它添加了一些额外的对象,因此在生成下一个元素的路径中添加了额外的方法调用。

编辑评论(与您的问题无关):

  • 不要使用 new Integer(val) .而是使用 Integer.valueOf(val)如果可用,它将重用装箱整数,这通常适用于 -128 到 127 范围内的值。
  • 您可以使用 IntStream而不是 Stream<Integer>这完全避免了装箱开销。它没有流操作的完整补充,但它确实有 iterate()它采用一个函数,该函数在原语 int 上运行值(value)观。

关于java - 从 Java 8 流中获取下一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26595020/

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