谁可以让我知道以下程序如何在内部工作:
public class Main {
public static void main(String[] args) {
Consumer<String> c = (x) -> System.out.println(x.toLowerCase());
c.andThen(c).andThen(c).accept("Java2s.com");
}
}
Run Code Online (Sandbox Code Playgroud)
Eug*_*ene 12
你看过代码了andThen
吗?
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
Run Code Online (Sandbox Code Playgroud)
它为每次调用创建一个新的Consumer andThen
,最后调用该accept
方法(这是唯一的抽象方法).
不同的方法怎么样:
Consumer<String> first = x -> System.out.println(x.toLowerCase());
Consumer<String> second = y -> System.out.println("aaa " + y);
Consumer<String> result = first.andThen(second);
Run Code Online (Sandbox Code Playgroud)
运行此代码不会产生任何结果,因为您尚未调用accept
任何地方.
另一方面,您可以看到accept
彼此呼叫时会发生什么:
Consumer<String> result = first.andThen(second);
first.accept("Java"); // java
second.accept("Java"); // aaa Java
System.out.println("---------");
result.accept("Java"); // java, aaa Java
Run Code Online (Sandbox Code Playgroud)
andThen
返回此Consumer的组合与下一个.
文档Consumer#andThen说:
返回一个组成的使用者,该使用者依次执行此操作,然后执行after操作。如果执行任何一个操作均引发异常,则将其中继到组合操作的调用方。如果执行此操作引发异常,则将不执行after操作。
这意味着您的消费者将被接受3次,例如:
v--- 1. c.accept("Java2s.com");
c.andThen(c).andThen(c).accept("Java2s.com");
^ ^
| |
| 3. c.accept("Java2s.com");
|
2. c.accept("Java2s.com");
Run Code Online (Sandbox Code Playgroud)