为什么要在Consumer功能界面中使用andThen?

时间:2019-07-08 05:15:12

标签: java-8

我想一个接一个地执行一项任务。 我们可以通过两种方式做到这一点。

第一种方法是:

List<String> list = Arrays.asList("Name1","Name2","Name3");
list.forEach((obj)->{
    System.out.println(obj);  //task1
    System.out.println(obj.length()); //task2
});

或者我们也可以这样:

List<String> list = Arrays.asList("Name1","Name2","Name3");
Consumer<String> c1 = (obj)-> System.out.println(obj); //task1
Consumer<String> c2 = (obj)-> System.out.println(obj.length()); //task2
list.forEach(c1.andThen(c2));

在两种情况下我们都得到相同的结果,然后请帮助我理解为什么我们在andThen功能界面中使用Consumer,如果这样做有任何好处,那又是什么。 / p>

谢谢。

1 个答案:

答案 0 :(得分:1)

函数(Function<A, B>背后的想法之一是它们是可组合的,

例如g(f(x))相当于Java中的f.andThen(g).apply(x)

定义一个或多个功能取决于您要为每个功能承担的责任。

例如,您可以使用单独的“用于递增数字的功能”和“用于创建数字平方的功能”,以便在需要时可以重复使用它们。

    Function<Integer, Integer> f = a -> a + 1;
    Function<Integer, Integer> g = a -> a * a;

    var  incrementAndSquare = f.andThen(g).apply(2); //9

    Function<Integer, Integer> h = a -> a - 1;

    var decrementAndSquare = h.andThen(g).apply(5); //16

注意:java中的Consumer<A>也是返回void的函数Function<A, void>

在您的情况下,如果仅使用println,那么一个功能就足够了,除非您在其他地方需要相同的功能。

如果要执行两个“单独的任务”,则可能需要定义单独的功能。这样可以使责任更加明确,提供可组合性,并且易于单独测试功能。