Java 8内部迭代

时间:2014-01-23 16:10:58

标签: java java-8

内部迭代是否仅使用forEach的{​​{1}}方法执行 对象或Collection的方法,如Streamfilter等?

4 个答案:

答案 0 :(得分:5)

从根本上对集合的所有成员进行操作需要迭代它们。

它的确切方式可能会根据集合和操作而改变,但它需要发生的事实是不可避免的。

答案 1 :(得分:4)

也许您应该首先通过术语“外部迭代”来定义您理解的内容。由于您在调用filtermapreduce时没有编程循环,因此根据定义,它不是外部迭代。

您可以尝试更改自己的观点,并查看filtermapreduce方法。但是,在尝试理解概念时查看实现并不一定有用。

执行filtermapreduce时,您要根据PredicateFunctionBiFunctionBinaryOperator。并且它们都不会使用Iterator实现循环,因此它仍然不是外部循环。

您似乎想知道迭代代码是在Collection类内部还是在Stream类中,但这是一个不重要的实现细节,因为它们是同一个库/框架的一部分因此,在任何一种情况下,迭代都被认为是关于这个库/框架的“内部”。

即使是第三个选项,拥有另一方,执行循环的Spliterator也不会改变迭代的性质。对于内部迭代而言,通常情况下,您无法在第一眼看到迭代实际发生的位置。

答案 2 :(得分:1)

@Tim B指出了内部迭代,但并非所有项都会被处理。当你链接几个操作以避免不必要的计算时,会有过滤和短路。

参考here

答案 3 :(得分:1)

流操作基于Spliterator的顶部,这是内部和外部迭代之间的奇怪组合。 Spliterator是集合的spliterator()方法返回的外部对象,但Spliterator本身接受回调以传递方法,就像内部迭代一样。

例如,collection.stream().forEach(consumer)(基本上)等同于collection.spliterator().forEachRemaining(consumer),或者可以像

一样使用
Spliterator<T> spliterator = collection.spliterator();
while (spliterator.tryAdvance(consumer)) {
   // do something
}