You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8如何将List<Person>转换为按grade分组的Map<Integer, List<Person>>

按Person的grade属性分组为Map<Integer, List>的实现方案

嘿,这需求其实挺常见的,我给你两种实用的实现方式,你可以根据项目的Java版本来选:

一、Java 8+ 推荐:Stream API 一行搞定

这是最简洁优雅的方式,利用Java 8引入的Stream和Collectors工具类,几行代码就能完成分组:

首先先补全你的Person类定义(假设你还没写全):

class Person {
    private String name;
    private Integer grade;

    // 构造器、getter/setter 省略,这里给出关键的getGrade方法
    public Integer getGrade() {
        return grade;
    }

    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后在你的PersonMain类里完成分组:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class PersonMain {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setName("Alice");
        person1.setGrade(1);

        Person person2 = new Person();
        person2.setName("Bob");
        person2.setGrade(2);

        Person person3 = new Person();
        person3.setName("Charlie");
        person3.setGrade(1);

        List<Person> personList = new ArrayList<>();
        personList.add(person1);
        personList.add(person2);
        personList.add(person3);

        // 核心分组代码
        Map<Integer, List<Person>> gradePersonMap = personList.stream()
                .collect(Collectors.groupingBy(Person::getGrade));

        // 测试输出
        gradePersonMap.forEach((grade, persons) -> {
            System.out.println("年级:" + grade);
            persons.forEach(p -> System.out.println("  姓名:" + p.getName()));
        });
    }
}

这里Collectors.groupingBy(Person::getGrade)会自动帮你把相同grade的Person对象归集到同一个List里,键就是对应的grade值,完全符合你的需求。

如果你的grade可能为null,可以加个兜底处理避免空指针:

Map<Integer, List<Person>> gradePersonMap = personList.stream()
        .collect(Collectors.groupingBy(p -> p.getGrade() == null ? 0 : p.getGrade()));

这里把null的grade映射为0,你也可以改成其他适合的默认值。

二、传统循环方式(兼容Java 7及以下)

如果你的项目还在用Java 7或者更低版本,用普通循环也能实现:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PersonMain {
    public static void main(String[] args) {
        // 初始化Person列表的代码和上面一样,省略...

        Map<Integer, List<Person>> gradePersonMap = new HashMap<>();
        for (Person person : personList) {
            Integer grade = person.getGrade();
            // 如果当前grade还没有对应的List,就新建一个
            if (!gradePersonMap.containsKey(grade)) {
                gradePersonMap.put(grade, new ArrayList<>());
            }
            // 把当前Person加到对应的List里
            gradePersonMap.get(grade).add(person);
        }

        // 测试输出和上面一样,省略...
    }
}

这种方式逻辑清晰,容易理解,适合需要兼容旧版本的场景。

两种方式都能完美实现你的分组需求,选哪种就看你的项目环境啦!

内容的提问来源于stack exchange,提问作者opuser1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:13:27