Java – 内部与外部迭代

Java – 内部与外部迭代

原文: https://howtodoinjava.com/java8/java-8-tutorial-internal-vs-external-iteration/

外部迭代

直到 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循环/迭代器)混合使用的情况下,内部迭代使客户端仅提供“做怎么”,而由库控制“怎么做”。 这提供了许多潜在的好处:客户端代码可以更加清晰,因为它只需要关注于陈述问题,而不是解决问题的细节,并且我们可以将复杂的优化代码移到可以使所有用户受益的库中。

这就是关于内部与外部迭代的全部内容。

祝您学习愉快!