Java8中的forEach方法详解

来源:互联网 发布:js点击radio触发事件 编辑:程序博客网 时间:2024/05/19 22:59

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<10; 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::0Iterator Value::1Iterator Value::2Iterator Value::3Iterator Value::4Iterator Value::5Iterator Value::6Iterator Value::7Iterator Value::8Iterator Value::9<<<<<<<<Java8之前迭代方式end.>>>>>>><<<<<<<<Java8使用forEach新迭代方式start...>>>>>>>Iterator Value::0Iterator Value::1Iterator Value::2Iterator Value::3Iterator Value::4Iterator Value::5Iterator Value::6Iterator Value::7Iterator Value::8Iterator Value::9<<<<<<<<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消费行为 或者称之为动作 (Consumer action )类型;

  • 然后将集合中的每个元素作为消费行为的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<10; 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::0Iterator Value::1Iterator Value::2Iterator Value::3Iterator Value::4Iterator Value::5Iterator Value::6Iterator Value::7Iterator Value::8Iterator Value::9<<<<<<<<Java8之前迭代方式end.>>>>>>><<<<<<<<Java8使用forEach新迭代方式start...>>>>>>>Iterator Value::0Iterator Value::1Iterator Value::2Iterator Value::3Iterator Value::4Iterator Value::5Iterator Value::6Iterator Value::7Iterator Value::8Iterator Value::9<<<<<<<<Java8使用forEach新迭代方式end.>>>>>>>使用自定义的消费动作行为处理集合元素:打印输出(动作执行的参数):0打印输出(动作执行的参数):1打印输出(动作执行的参数):2打印输出(动作执行的参数):3打印输出(动作执行的参数):4打印输出(动作执行的参数):5打印输出(动作执行的参数):6打印输出(动作执行的参数):7打印输出(动作执行的参数):8打印输出(动作执行的参数):9

需要了解的几个新的API 接口以及方法

  • java.lang.Iterable#forEach

  • java.util.function.Consumer#accept

0 0
原创粉丝点击