巧用Lambda表达式的引用方法对集合进行遍历

先上代码大家感受一下:

public class Test4 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.forEach(System.out::println);
    }
}

运行结果:

除了我们目前所知道的用for循环和iterator迭代器来对集合进行遍历之外,我们还可以调用集合的 public void forEach(Consumer action) 方法,通过 lambda 表达式的方式遍历集合中的元素。

在forEach方法中有一个参数Consumer,Consumer是JDK所提供的一个函数式接口

 该函数式接口中只有一个抽象方法accept,和一个非抽象方法Consumer。所以我们可以定义一个接口实现类,把这个接口中的accept做一个实现。而accept方法传过来一个T,这个T其实就是forEach方法遍历出来的每一个元素,将其交给accept方法,然后accept方法决定对遍历出来的每一个元素去进行怎样的处理。比如说我们现在就对每一个元素进行println输出处理,代码如下:

class ConsumerImpl implements Consumer{

    @Override
    public void accept(Object o) {
        System.out.println(o);
    }
}
public class Test4 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        ConsumerImpl c = new ConsumerImpl();
        list.forEach(c);
    }
}

但感觉还是比较麻烦。

观察知道,accept方法的结构为无返回值需要一个参数。而println方法的结构也为无返回值需要一个参数。

 与accept一致,所以我们可以使用Lambda表达式的引用方法直接将println方法交给forEach循环。等同于forEach遍历出来的每一个元素都交给println然后直接输出。相当于将println方法作为accept的一个具体实现方法。

而我们也可以将System.out这个成员变量来作为println方法的一个归属者,最终代码为:

public class Test4 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.forEach(System.out::println);
    }
}

是不是非常的简便!!!


版权声明:本文为kangkang12221222原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。