MST
星途 面试题库

面试题:Java中自定义对象集合通过Stream流进行多条件动态分组及数据统计

有一个自定义类Person,包含属性name(字符串)、age(整型)、salary(双精度浮点型)。现有一个Person对象的集合List<Person> people,要求根据不同的业务需求动态地通过Stream流对这个集合进行分组,比如按照age是否大于30分组,并且在分组后统计每组中salary的总和,每组name的数量等信息,使用Java 8及以上版本的Stream API实现,写出通用灵活的代码,能适应不同动态分组条件及统计需求。
43.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
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);
    }
}
  1. Person类:定义了nameagesalary三个属性及其对应的getter方法。
  2. 动态分组和统计
    • Function<Person, Boolean> ageGroupCondition定义了动态分组条件,这里以age > 30为例。
    • 使用Collectors.groupingBy进行分组,在下游收集器中,通过Collectors.collectingAndThen先将分组后的Person对象收集为List,再统计每组中的salary总和以及name的数量,并最终以Map形式返回。Map的键为分组条件的结果(truefalse),值为包含统计信息的Map