有人可以让我知道以下程序如何在内部运作:
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");
}
}
答案 0 :(得分:9)
您是否看过andThen
的代码?
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
它为每次调用andThen
创建一个新的Consumer,最后调用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);
运行此代码不会产生任何效果,因为您尚未在任何地方调用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
andThen
返回此Consumer的组合与下一个。
答案 1 :(得分:4)
文档Consumer#andThen说:
返回一个组合的Consumer,它按顺序执行此操作,然后执行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");