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

时间:2017-05-29 07:42:29

标签: 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");
  }
}

2 个答案:

答案 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");