public static void main(String[] args) {
Consumer<String> c1=msg -> System.out.println(msg.toUpperCase());
Consumer<String> c2= msg -> System.out.println(msg.toLowerCase());
String str = "this is world";
c1.andThen(c2).accept(str);
}
// consumer中的andThen 代码
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
函数式编程就是为了应对一些不需要关心方法名,参数名以及实现方法的场景而有的产物,函数式编程有在用,但也用的不是很明白,今天看了下源代码就感到 andThen很奇怪:
accept(t);after.accept(t); 明明是没有返回值的,但是前面为什么可以加return呢??
后来发现return返回的是一个构造Consumer对象的过程
consumer.andThen()方法解析:
这里面是先将调用者本身执行一次accept()方法,然后再将参数中的Consumer对象(after)执行一次accept
也可以理解为:c1.andThen(c2)是将c1和c2合成一个新的c3然再执行accept(),
c3的方法逻辑是先执行c1.accept(t)逻辑,然后再执行c2.accept(t)。
c1.accept(t):是将传进来的字符串转为大写
c2.accept(t):是将传进来的字符串转为小写,注意:参数t不受c1的执行结果影响
执行结果:
THIS IS WORLD
this is world
Process finished with exit code 0