Java函数式编程forEach理解

forEach是jdk8中Iterable新增的方法,源码如下:

  / * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

而List间接继承了Iterable,所以List也有forEach这个默认方法。从源码可以看出,参数是一个Consumer类型的接口,forEach方法就是接收一个参数为Consumer类型,然后执行自己内部实现的for循环方法。
在8之前,可以这样

List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        Consumer<Integer> c=new Consumer<Integer>(){
            @Override
            public void accept(Integer integer) {
                System.out.println(integer);
            }
        };
        list.forEach(c);

也可以使用匿名内部类的方式,匿名内部类实际会新生成xxx$1.class文件,并不是说可以new一个接口。

 List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        list.forEach(new Consumer<Integer>(){
            @Override
            public void accept(Integer integer) {
                System.out.println(integer);
            }
        });

jkd8后,我们不仅可以使用匿名内部类作为参数,也可以使用函数式接口作为参数
函数式接口有以下三种类型,
1.lambda表达式
2.方法引用
3.构造方法引用
我们先来验证第一种函数式接口类型lambda表达式。
具体的lambda的简写代码方式,我这边就不讲解了。lambda的作用就是一个是简写代码,另一个就是现在讲的作为函数式接口的类型。,Lambda表达式是对象,它们必须依附于一类特别的对象类型——函数式接口(Functional Interface)。什么是函数式接口呢?如果一个接口中,有且只有一个抽象的方法(Object类中的方法不包括在内),那这个接口就可以被看做是函数式接口。
所以上面的代码如果改成传参是lambda表达式,

       List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        list.forEach(i->System.out.println(i));

接下来是方法引用,其实就是传一个方法过去。:方法引用
方法引用的语法是 对象::方法名(只是其中一种)

public class Test1 {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        list.forEach(Test1::print);
    }
    public static void print(int i){
        System.out.println(i);
    }
}

最后我们来看下创建函数式接口的最后一种,第三种方式:构造方法引用 ,继续改程序

public class Test1 {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        //构造方法引用
        list.forEach(Test1::new);
    }

    Test1(Integer i){
        System.out.println(i);
    }
}

参考https://segmentfault.com/a/1190000012213954

猜你喜欢

转载自blog.csdn.net/lkpklpk/article/details/81282083