关于 Java Streams 中 Collector 和 Function 参数排序的问题
Question about ordering of parameters of Collector and Function in Java Streams
所以我正在研究 Java Streams,我对某些参数的顺序的含义有一些疑问。
一些上下文:
public static List<Person> createPeople() {
return List.of(new Person("Sara", 20),
new Person("Sara", 22),
new Person("Bob", 20),
new Person("Paula",32),
new Person("Paul", 32),
new Person("Jack", 3),
new Person("Jack", 72),
new Person("Jill", 11));
}
List<Person> people = Section.createPeople();
考虑以下代码:
Map<String, Integer> countByName3 = people.stream()
.collect(groupingBy(Person::getName,
collectingAndThen(counting(), Long::intValue)));
这段代码的重点是输出一个键值对,其中键是人名,值是具有该特定名字的人数。
现在我的理解是,collect 方法将 Collector objects 由 Collectors class 中的函数生成,例如 groupingBy 作为其参数。
我也了解到其中一些方法的参数中有一个Function。我感兴趣的是函数和收集器在生成收集器的方法中的顺序 object 扮演的角色。
例如,groupingBy() 按 (Function, Collector) 的顺序接受参数,而 collectingAndThen() 按 (Collector, Function) 的顺序接受参数。如果我没记错的话,都是 return 收藏家。
因此,颠倒的顺序是什么意思,它是否表示某些东西在幕后是如何处理的?如果订单后面有difference/meaning,我可以得到解释吗?
非常感谢。
这里没有什么神奇的事情发生。 Collectors
是 只是 一个 class。和其他人一样。它有静态方法。您可以调用它们,这里绝对没有魔法。如果需要,您可以使用返回 Collector
类型实例的静态方法创建自己的 class。
鉴于它们只是方法,语言中绝对没有关于参数顺序的固有内容。 collectingAndThen
方法的作者分别对groupingBy
方法做出了决定。就这些了。
如果您想解释为什么这些作者决定将论点按这些顺序排列,您必须问他们 - 这不是 Stack Overflow 的合适问题,所以我会给你怀疑的好处并假设您知道这一点,并要求人们就原因发表意见。这也不太适合 SO。但是,放纵你:
这对我来说很有意义。 collectingAndThen
与该方法的名称顺序相同:“创建一个新的收集器,首先应用这个收集器(第一个参数),但在收集后应用这个完成转换(第二个参数)”。
参数按照解释其作用的顺序排列。
groupingBy,做完全相同的事情:通过按某个键分组来创建一个收集器;要派生这个密钥,通过这个转换函数把流中的所有东西都扔掉。然后,通过使用 THIS 收集器应用此键值来实际收集所有内容。
两者都在这个 'in the order you mention the parameters if you would explain what it does' 顺序中。 groupingBy
的第一个 'thing' 恰好是 Function
而其第二个 'thing' 恰好是 Collector
,而 collectingAndThen
第一个 'thing' 是 Collector
而第二个 'thing' 是 Function
完全是巧合。
所以我正在研究 Java Streams,我对某些参数的顺序的含义有一些疑问。
一些上下文:
public static List<Person> createPeople() {
return List.of(new Person("Sara", 20),
new Person("Sara", 22),
new Person("Bob", 20),
new Person("Paula",32),
new Person("Paul", 32),
new Person("Jack", 3),
new Person("Jack", 72),
new Person("Jill", 11));
}
List<Person> people = Section.createPeople();
考虑以下代码:
Map<String, Integer> countByName3 = people.stream()
.collect(groupingBy(Person::getName,
collectingAndThen(counting(), Long::intValue)));
这段代码的重点是输出一个键值对,其中键是人名,值是具有该特定名字的人数。
现在我的理解是,collect 方法将 Collector objects 由 Collectors class 中的函数生成,例如 groupingBy 作为其参数。
我也了解到其中一些方法的参数中有一个Function。我感兴趣的是函数和收集器在生成收集器的方法中的顺序 object 扮演的角色。
例如,groupingBy() 按 (Function, Collector) 的顺序接受参数,而 collectingAndThen() 按 (Collector, Function) 的顺序接受参数。如果我没记错的话,都是 return 收藏家。
因此,颠倒的顺序是什么意思,它是否表示某些东西在幕后是如何处理的?如果订单后面有difference/meaning,我可以得到解释吗?
非常感谢。
这里没有什么神奇的事情发生。 Collectors
是 只是 一个 class。和其他人一样。它有静态方法。您可以调用它们,这里绝对没有魔法。如果需要,您可以使用返回 Collector
类型实例的静态方法创建自己的 class。
鉴于它们只是方法,语言中绝对没有关于参数顺序的固有内容。 collectingAndThen
方法的作者分别对groupingBy
方法做出了决定。就这些了。
如果您想解释为什么这些作者决定将论点按这些顺序排列,您必须问他们 - 这不是 Stack Overflow 的合适问题,所以我会给你怀疑的好处并假设您知道这一点,并要求人们就原因发表意见。这也不太适合 SO。但是,放纵你:
这对我来说很有意义。 collectingAndThen
与该方法的名称顺序相同:“创建一个新的收集器,首先应用这个收集器(第一个参数),但在收集后应用这个完成转换(第二个参数)”。
参数按照解释其作用的顺序排列。
groupingBy,做完全相同的事情:通过按某个键分组来创建一个收集器;要派生这个密钥,通过这个转换函数把流中的所有东西都扔掉。然后,通过使用 THIS 收集器应用此键值来实际收集所有内容。
两者都在这个 'in the order you mention the parameters if you would explain what it does' 顺序中。 groupingBy
的第一个 'thing' 恰好是 Function
而其第二个 'thing' 恰好是 Collector
,而 collectingAndThen
第一个 'thing' 是 Collector
而第二个 'thing' 是 Function
完全是巧合。