import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
private double salary;
public Person(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getSalary() {
return salary;
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 25, 5000.0),
new Person("Bob", 35, 6000.0),
new Person("Charlie", 28, 5500.0),
new Person("David", 40, 7000.0)
);
// 动态分组条件
Function<Person, Boolean> ageGroupCondition = person -> person.getAge() > 30;
// 动态统计需求
Map<Boolean, Map<String, Object>> result = people.stream()
.collect(Collectors.groupingBy(
ageGroupCondition,
Collectors.collectingAndThen(
Collectors.toList(),
list -> {
double totalSalary = list.stream().mapToDouble(Person::getSalary).sum();
long nameCount = list.size();
return Map.of(
"totalSalary", totalSalary,
"nameCount", nameCount
);
}
)
));
System.out.println(result);
}
}
- Person类:定义了
name
、age
、salary
三个属性及其对应的getter方法。
- 动态分组和统计:
Function<Person, Boolean> ageGroupCondition
定义了动态分组条件,这里以age > 30
为例。
- 使用
Collectors.groupingBy
进行分组,在下游收集器中,通过Collectors.collectingAndThen
先将分组后的Person
对象收集为List
,再统计每组中的salary
总和以及name
的数量,并最终以Map
形式返回。Map
的键为分组条件的结果(true
或false
),值为包含统计信息的Map
。