关于 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 完全是巧合。