Consumer和Begin方法如何在java功能接口内部工作

sid*_*ani 4 java java-8

谁可以让我知道以下程序如何在内部工作:

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的组合与下一个.

  • 在这段代码给你带来“我明白了……”的时刻之后,再次阅读文档=) (2认同)

hol*_*ava 5

文档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)