在Java中我们需要处理Clloection的时候,通常需要创建一个Iterator实例来对集合进行迭代,在迭代中对每个或者某些元素进行业务逻辑的操作。如果迭代使用不当的话,则会抛出ConcurrentModificationException异常。
旧API、新的forEach API进行遍历打印集合中的元素对比
下面比较使用旧API、新的forEach API进行遍历打印集合中的元素:
- 旧API需要获取集合的Iterator迭代器实例来进行遍历;
- 新的API结合lambda表达式使用一行代码即可: myList.forEach(s -> {System.out.println("Iterator Value::"+s);});
package com.byron4j.hightLevel.java8.lambda;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*
* <pre>
* Java8 的 forEach方法演示实例
* 通过遍历打印集合元素比较 新旧方式的使用区别
* </pre>
* @author Byron.Y.Y
*/
public class Java8ForEachDemo {
public static void main(String[] args) {
List<Integer> myList = new ArrayList<Integer>();
for(int i=0; i<3; i++) myList.add(i);
System.out.println("<<<<<<<<Java8之前迭代方式start...>>>>>>>");
Iterator<Integer> it = myList.iterator();
while(it.hasNext()){
Integer i = it.next();
System.out.println("Iterator Value::"+i);
}
System.out.println("<<<<<<<<Java8之前迭代方式end.>>>>>>>");
System.out.println("<<<<<<<<Java8使用forEach新迭代方式start...>>>>>>>");
myList.forEach(s -> {System.out.println("Iterator Value::"+s);});
System.out.println("<<<<<<<<Java8使用forEach新迭代方式end.>>>>>>>");
}
}
两种方式得到的是一样的结果:
<<<<<<<<Java8之前迭代方式start...>>>>>>>
Iterator Value::0
Iterator Value::1
Iterator Value::2
<<<<<<<<Java8之前迭代方式end.>>>>>>>
<<<<<<<<Java8使用forEach新迭代方式start...>>>>>>>
Iterator Value::0
Iterator Value::1
Iterator Value::2
<<<<<<<<Java8使用forEach新迭代方式end.>>>>>>>
JAVA8中forEach方法的详解
forEach方法是JAVA8中在集合父接口java.lang.Iterable中新增的一个default实现方法:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
- forEach方法接受一个在JAVA8中新增的java.util.function.Consumer的消费行为或者称之为动作(Consumeraction)类型;
- 然后将集合中的每个元素作为消费行为的accept方法的参数执行;
- 直到每个元素都处理完毕或者抛出异常即终止行为;
- 除非指定了消费行为action 的实现,否则默认情况下是按迭代里面的元素顺序依次处理。
自定义消费行为动作Consumer action
- 首先,需要实现java.util.function.Consumer接口;
- 再次,实现其accept方法
package com.byron4j.hightLevel.java8.lambda;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
/**
*
* <pre>
* Java8 的 forEach方法演示实例
* 通过遍历打印集合元素比较 新旧方式的使用区别
* </pre>
* @author Byron.Y.Y
*/
public class Java8ForEachDemo2 {
public static void main(String[] args) {
List<Integer> myList = new ArrayList<Integer>();
for(int i=0; i<3; i++) myList.add(i);
System.out.println("<<<<<<<<Java8之前迭代方式start...>>>>>>>");
Iterator<Integer> it = myList.iterator();
while(it.hasNext()){
Integer i = it.next();
System.out.println("Iterator Value::"+i);
}
System.out.println("<<<<<<<<Java8之前迭代方式end.>>>>>>>");
System.out.println("<<<<<<<<Java8使用forEach新迭代方式start...>>>>>>>");
myList.forEach(s -> {System.out.println("Iterator Value::"+s);});
System.out.println("<<<<<<<<Java8使用forEach新迭代方式end.>>>>>>>");
System.out.println("使用自定义的消费动作行为处理集合元素:");
//创建自定义消费行为动作实例
MyConsumer myConsumer = new MyConsumer();
myList.forEach(myConsumer);
}
static class MyConsumer implements Consumer<Object>{
@Override
public void accept(Object t) {
System.out.println("打印输出(动作执行的参数):" + t);
}
}
}
看看输出结果:
<<<<<<<<Java8之前迭代方式start...>>>>>>>
Iterator Value::0
Iterator Value::1
Iterator Value::2
<<<<<<<<Java8之前迭代方式end.>>>>>>>
<<<<<<<<Java8使用forEach新迭代方式start...>>>>>>>
Iterator Value::0
Iterator Value::1
Iterator Value::2
<<<<<<<<Java8使用forEach新迭代方式end.>>>>>>>
使用自定义的消费动作行为处理集合元素:
打印输出(动作执行的参数):0
打印输出(动作执行的参数):1
打印输出(动作执行的参数):2
需要了解的几个新的API 接口以及方法
- java.lang.Iterable#forEach
- java.util.function.Consumer#accept
作者:东陆之滇
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。