java8 - 内置函数式接口(Consumer)

Consumer

如果需要访问类型T的对象,并对其执行某些操作,就可以使用这个Consumer接口。

输出list的内容
public static void main(String[] args) {
    List list = Arrays.asList("1", "2", "3", "11", "22", "33");
    Consumer consumer = (String str) -> System.out.println(str);
    Consumer andThenConsumer = (String str) -> System.out.println("andThen:" + str);
    Consumer andThen2Consumer = (String str) -> System.out.println("andThen2:" + str);
    forEach(list, consumer);
    forEach(list, consumer, andThenConsumer);
    forEach(list, consumer, andThenConsumer, andThen2Consumer);
}

public static  void forEach(List list, Consumer consumer) {
    for (T t : list) {
        consumer.accept(t);
    }
}

运行结果如下:
java8 - 内置函数式接口(Consumer)_第1张图片
accept方法负责对字符串的输出。

复合

andThen

除了对字符串的直接输出,还要在前面加个andThen
public static  void forEach(List list, Consumer consumer, Consumer andThenConsumer) {
    for (T t : list) {
        consumer.andThen(andThenConsumer).accept(t);
    }
}

运行结果如下:
java8 - 内置函数式接口(Consumer)_第2张图片
源码如下:

default Consumer andThen(Consumer after) {
    Objects.requireNonNull(after);
    return (T t) -> { accept(t); after.accept(t); };
}

所以先执行accept的方法,再执行andThen的方法。

多个andThen

除了对字符串的直接输出,还要在前面加个andThen以及andThen2
public static  void forEach(List list, Consumer consumer, Consumer andThenConsumer, Consumer andThen2Consumer) {
    for (T t : list) {
        consumer.andThen(andThenConsumer).andThen(andThen2Consumer).accept(t);
    }
}

运行结果如下:
java8 - 内置函数式接口(Consumer)_第3张图片
可以看出,accept方法先执行,然后在从左到右依次执行andThen

你可能感兴趣的:(java,lambda)