【发布时间】:2015-08-18 11:54:56
【问题描述】:
我想使用 Java 8 Stream 并按一个分类器分组,但有多个收集器函数。因此,在分组时,例如计算一个字段(或另一个字段)的平均值和总和。
我试着用一个例子来简化一下:
public void test() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Person One", 1, 18));
persons.add(new Person("Person Two", 1, 20));
persons.add(new Person("Person Three", 1, 30));
persons.add(new Person("Person Four", 2, 30));
persons.add(new Person("Person Five", 2, 29));
persons.add(new Person("Person Six", 3, 18));
Map<Integer, Data> result = persons.stream().collect(
groupingBy(person -> person.group, multiCollector)
);
}
class Person {
String name;
int group;
int age;
// Contructor, getter and setter
}
class Data {
long average;
long sum;
public Data(long average, long sum) {
this.average = average;
this.sum = sum;
}
// Getter and setter
}
结果应该是一个关联分组结果的Map
1 => Data(average(18, 20, 30), sum(18, 20, 30))
2 => Data(average(30, 29), sum(30, 29))
3 => ....
这对像“Collectors.counting()”这样的一个函数非常有效,但我喜欢链接多个(理想情况下从列表中无限)。
List<Collector<Person, ?, ?>>
有可能做这样的事情吗?
【问题讨论】:
-
我是否理解正确,您的
Data类只是平面图函数集合的占位符?这些函数中的每一个都必须对所有组执行相同的操作(例如,首先计算组的平均年龄,然后计算总年龄等)? -
当我说对了,我想是的。我只是用它在一个对象中保存多个数据,同时仍然能够识别哪个是哪个。也可以是 Key=FunctionName, Value=FunctionResult 的 Array 或 Map。
标签: java java-8 java-stream