我想一个接一个地执行一项任务。 我们可以通过两种方式做到这一点。
第一种方法是:
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>
谢谢。
答案 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
,那么一个功能就足够了,除非您在其他地方需要相同的功能。
如果要执行两个“单独的任务”,则可能需要定义单独的功能。这样可以使责任更加明确,提供可组合性,并且易于单独测试功能。