Java 8 为什么在消费者功能界面中使用andThen?

Java 8 为什么在消费者功能界面中使用andThen?,java-8,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 List=Arrays.asList(“Name1”、“N

我想一个接一个地完成一项任务。 我们可以用两种方法来做

第一种方法是:

List<String> list = Arrays.asList("Name1","Name2","Name3");
list.forEach((obj)->{
    System.out.println(obj);  //task1
    System.out.println(obj.length()); //task2
});
List List=Arrays.asList(“Name1”、“Name2”、“Name3”);
列表。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));
List List=Arrays.asList(“Name1”、“Name2”、“Name3”);
消费者c1=(obj)->System.out.println(obj)//任务1
使用者c2=(obj)->System.out.println(obj.length())//任务2
表1.forEach(c1.和第(c2)段);
在这两种情况下,我们得到了相同的结果,那么请帮助我理解为什么我们在
消费者
功能界面中使用
,如果使用它有任何好处,那么它是什么


提前感谢。

函数(
函数
)背后的一个理念是它们是可组合的

例如,
g(f(x))
这相当于
f.and(g)。在java中应用(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
函数f=a->a+1;
函数g=a->a*a;
var增量和平方=f,然后(g)应用(2)//9
函数h=a->a-1;
var递减和平方=h,然后(g)应用(5)//16
注意
消费者
在java中也是一个返回void的函数

在您的情况下,如果它只是
println
,可能一个函数就足够了,除非您在其他地方需要相同的函数


如果您正在执行两个“单独的任务”,则可能需要定义单独的函数。这使得职责更加明确,提供了可组合性,易于单独测试函数。

函数(
函数
)背后的一个理念是它们是可组合的

例如,
g(f(x))
这相当于
f.and(g)。在java中应用(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
函数f=a->a+1;
函数g=a->a*a;
var增量和平方=f,然后(g)应用(2)//9
函数h=a->a-1;
var递减和平方=h,然后(g)应用(5)//16
注意
消费者
在java中也是一个返回void的函数

在您的情况下,如果它只是
println
,可能一个函数就足够了,除非您在其他地方需要相同的函数


如果您正在执行两个“单独的任务”,则可能需要定义单独的函数。这使职责更加明确,提供了可组合性,易于单独测试功能。

您可以在代码审阅时问这个问题。不要在CR上这样问。为问题添加更多的上下文。您看到的场景是,您创建了两个使用者,或一个同时包含两个任务的使用者。现在考虑一下,如果一个代码>消费者< /Code >实例已经存在并且超出了你的责任。你可以在代码审查上问这个问题。不要在CRC上这样问。在这个问题上添加更多的上下文。你正在寻找一个场景,你可以同时创建两个消费者或者一个覆盖两个任务。现在考虑一下,如果一个“代码>消费者< /Calp>”实例已经存在并且超出了您的责任范围。