Java – 内部与外部迭代
Java – 内部与外部迭代
外部迭代
直到 Java 7 为止,集合框架都依赖于外部迭代的概念,其中集合通过实现Iterable
提供枚举其元素(即Iterator
)的方法,并且客户端使用它顺序地遍历了集合。 例如,如果我们想将所有字符串都大写,则可以这样写:
public class IterationExamples {
public static void main(String[] args){
List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"});
for(String letter: alphabets){
System.out.println(letter.toUpperCase());
}
}
}
或者我们可以这样写:
public class IterationExamples {
public static void main(String[] args){
List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"});
Iterator<String> iterator = alphabets.listIterator();
while(iterator.hasNext()){
System.out.println(iterator.next().toUpperCase());
}
}
}
以上两个代码段均用于外部迭代。 外部迭代非常简单,但是存在几个问题:
1)Java 的for-each
循环/迭代器本质上是顺序的,必须按集合指定的顺序处理元素。
2)它限制了管理控制流的机会,该控制流可能能够通过利用数据的重新排序,并行性,短路或惰性来提供更好的性能。
内部迭代
有时需要for-each
循环的强力保证(顺序,顺序),但通常只是性能的劣势。 外部迭代的替代方法是内部迭代,客户端让它由库处理而不是控制迭代,而仅提供必须对所有/某些数据元素执行的代码。
上一个示例的内部迭代等效项是:
public class IterationExamples {
public static void main(String[] args){
List<String> alphabets = Arrays.asList(new String[]{"a","b","b","d"});
alphabets.forEach(l -> l.toUpperCase());
}
}
在外部迭代将“做怎么”(大写)和“怎么做”(for
循环/迭代器)混合使用的情况下,内部迭代使客户端仅提供“做怎么”,而由库控制“怎么做”。 这提供了许多潜在的好处:客户端代码可以更加清晰,因为它只需要关注于陈述问题,而不是解决问题的细节,并且我们可以将复杂的优化代码移到可以使所有用户受益的库中。
这就是关于内部与外部迭代的全部内容。
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果