MST

星途 面试题库

面试题:Java Stream collect方法在复杂对象集合处理中的应用

假设有一个包含多个员工对象的List集合,员工对象包含姓名、年龄、工资等属性。现在需要使用Stream的collect方法,按照年龄分组,统计每个年龄组的员工平均工资,并将结果以Map<Integer, Double>的形式返回,其中键为年龄,值为平均工资。请写出实现代码并解释实现思路。
28.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.*;
import java.util.stream.Collectors;

class Employee {
    private String name;
    private int age;
    private double salary;

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Employee> employees = Arrays.asList(
                new Employee("Alice", 25, 5000.0),
                new Employee("Bob", 30, 6000.0),
                new Employee("Charlie", 25, 5500.0)
        );

        Map<Integer, Double> result = employees.stream()
               .collect(Collectors.groupingBy(
                        Employee::getAge,
                        Collectors.averagingDouble(Employee::getSalary)
                ));

        System.out.println(result);
    }
}

实现思路

  1. 分组与统计
    • 使用Collectors.groupingBy方法对employees列表中的员工对象按年龄进行分组。Collectors.groupingBy接受两个参数,第一个参数是分组的依据,这里通过Employee::getAge提取员工的年龄作为分组的键。
    • 第二个参数是下游收集器,这里使用Collectors.averagingDouble,它的作用是对每个分组中的员工工资进行求平均操作,通过Employee::getSalary获取每个员工的工资。
  2. 结果返回
    • collect方法最终返回一个Map<Integer, Double>,其中键Integer是员工的年龄,值Double是对应年龄组员工的平均工资。
  3. 输出结果
    • main方法中,将结果打印输出,展示每个年龄组的平均工资。