原创

JAVA8系列教程-内部与外部迭代器

温馨提示:
本文最后更新于 2020年04月21日,已超过 1,675 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

外部迭代

直到Java 7为止,collections框架都依赖于外部迭代的概念,其中Collection通过实现Iterable提供枚举其元素(即Iterator)的方法,并且客户端使用它顺序地遍历collection的元素。例如,如果我们想将所有字符串都大写,则可以这样写:

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


正文到此结束
该篇文章的评论功能已被站长关闭
本文目录