内部迭代是否仅使用forEach
的{{1}}方法执行
对象或Collection
的方法,如Stream
,filter
等?
答案 0 :(得分:5)
从根本上对集合的所有成员进行操作需要迭代它们。
它的确切方式可能会根据集合和操作而改变,但它需要发生的事实是不可避免的。
答案 1 :(得分:4)
也许您应该首先通过术语“外部迭代”来定义您理解的内容。由于您在调用filter
,map
或reduce
时没有编程循环,因此根据定义,它不是外部迭代。
您可以尝试更改自己的观点,并查看filter
,map
或reduce
方法。但是,在尝试理解概念时查看实现并不一定有用。
执行filter
,map
或reduce
时,您要根据Predicate
,Function
,BiFunction
或BinaryOperator
。并且它们都不会使用Iterator
实现循环,因此它仍然不是外部循环。
您似乎想知道迭代代码是在Collection
类内部还是在Stream
类中,但这是一个不重要的实现细节,因为它们是同一个库/框架的一部分因此,在任何一种情况下,迭代都被认为是关于这个库/框架的“内部”。
即使是第三个选项,拥有另一方,执行循环的Spliterator
也不会改变迭代的性质。对于内部迭代而言,通常情况下,您无法在第一眼看到迭代实际发生的位置。
答案 2 :(得分:1)
答案 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
}