java8- 从外部迭代到内部迭代
首先,看一段简单的代码。
//定义一个集合
List<Integer> points = Arrays.asList(1,2);
传统方式, java 5之前:
for (int j = 0; j < points.size(); j++) {
System.out.println(points.get(j));
}
Iterator<Integer> iterator = points.iterator();
while(iterator.hasNext()) {
System.out.println("java 5之前:" + iterator.next());
}
java 5之后:
for (Integer point : points) {
System.out.println("for each:" + point);
}
在java 8之前,一直就是用的是上述几种方式。它们的共性是,按照先后顺序返回集合中的元素。当然,在CPU单核时代这样是合情合理的。然而,随着硬件的发展,双核、四核、八核等,趋势很明显,不适应这种模式就会在不远的将来败下阵来,java程序永远只能绑定到单核上。所以,就需要一种新的访问模式,使之能够将多个任务分发到多个核上并发执行,从而利用多核的处理能力。
从以上的迭代示例可以分析得到,代码一次只能根据外部迭代器制定的顺序访问一个列表元素。
A(迭代器)---> B(元素集合){
//执行逻辑...
}
Eg:"快递公司,A(领导或者工作制度)要求B(快递员)重复如下操作:如果还有快递,那么按照收件人姓氏的字母表顺序取出下一个,然后通知收件人来取件"。
分析:有一种感觉,A的要求太啰嗦了。其实,对快递员来说,顺序并不重要,不管用什么方式,无论顺序执行,还是并行,只要把所有快递送完就行。
所以,对于来说,到底怎么做,取决于B自己。而不是像外部迭代那样指定我怎么做。
那么代码该怎么改了?
集合只需要提供一个方法来接受“做什么”。所以, java8版本中 ,提供了方法void: forEach();
借助于此方法,上边的代码可以改为 list.forEach(........);
points.forEach(p ->System.out.print("java8 迭代:"+p));
至此,外部迭代转换为内部迭代了,并且由集合forEach的方法来管理。Collection.forEacj()方法实际上是由Collection从Iterator继承的。内部迭代的好处是,代码精简、乱序执行等