在Java 8流中没有索引的原因是什么?

ski*_*iwi 10 java java-8 java-stream

我想知道Java 8流(Stream<E>),他们有以下方法:

  • forEach(Consumer<? super E> action)
  • forEachOrdered(Consumer<? super E> action)

反对不提供以下签名的论点是什么?

  • forEachOrdered(BiConsumer<Integer, ? super E> action)
    • 然后,它将返回流中项目的索引和项目本身.

有了这个重载,就可以在订购流的情况下实际使用索引.

我真的很想知道反对它的论点是什么.

编辑,同样的实际持有的Iterator<E>forEachRemaining,甚至更多的类.
如果没有类提供这样的选项,那么我怀疑它已被考虑用于Java 8并被拒绝.

aep*_*iet 8

索引每个元素需要按顺序分配索引.这会破坏并行操作的重点,因为每个操作都必须同步才能获得其索引.


Jef*_*rey 6

Streams和Iterators不一定是有限的.双方Stream::generateStream::iterate返回无限Stream秒.您将如何使用无限流处理索引?让指数溢出到负数?使用BigInteger(并可能耗尽内存)?

处理无限流的索引并不是一个好的解决方案,因此设计人员(在我看来,正确地说)将其排除在API之外.

  • 使用`Collectors.counting()`会出现同样的问题,使用了`long`,但它也可能溢出.所以在这一点上要么你的论证不够好,要么就是反对`Collectors.counting()`的好论据.我没有看到任何其他问题,但有无限的流和迭代器(除此之外他们永远不会停止) (3认同)