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

Java 8按ID分组User对象,合并属性生成目标Map集合

Java 8实现按ID分组并合并User的subject属性

首先先修正原代码里的几个编译问题:

  • Main类的main方法参数应为String[] args,不是str args[]
  • 创建user3时类名要大写,应为User user3
  • User类需要添加对应构造方法,否则无法直接通过new User(id, name, subject)初始化对象
  • 建议把subject转为可变集合(比如ArrayList),因为Arrays.asList()返回的是不可变列表,合并时会抛出异常

修正后的User类

import java.util.ArrayList;
import java.util.List;

class User {
    int id;
    String name;
    List<String> subject;

    // 构造方法
    public User(int id, String name, List<String> subject) {
        this.id = id;
        this.name = name;
        // 转为可变集合,方便后续合并
        this.subject = new ArrayList<>(subject);
    }

    // 重写toString,方便打印结果
    @Override
    public String toString() {
        return "User(" + id + ", \"" + name + "\", " + subject + ")";
    }

    // Getter方法,用于合并操作
    public int getId() {
        return id;
    }

    public List<String> getSubject() {
        return subject;
    }
}

实现分组与属性合并的代码

在Main类中,我们可以利用Java 8的Collectors.toMap()实现按ID分组,同时合并同一ID下的subject列表:

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

class Main {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        User user1 = new User(1, "John", Arrays.asList("English"));
        User user2 = new User(2, "Peter", Arrays.asList("English"));
        User user3 = new User(1, "John", Arrays.asList("Chemistry"));
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);

        // 按ID分组并合并subject
        Map<Integer, User> mergedUserMap = userList.stream()
                .collect(Collectors.toMap(
                        User::getId, // 以id作为Map的键
                        user -> user, // 初始值为当前User对象
                        (existingUser, newUser) -> {
                            // 合并两个User的subject列表
                            existingUser.getSubject().addAll(newUser.getSubject());
                            return existingUser;
                        }
                ));

        // 如果需要转为题目要求的Map<Integer, List<User>>格式
        Map<Integer, List<User>> resultMap = mergedUserMap.entrySet().stream()
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        entry -> Arrays.asList(entry.getValue())
                ));

        // 打印结果验证
        resultMap.forEach((id, users) -> System.out.println("User" + id + " = " + users.get(0)));
    }
}

代码逻辑说明

  1. Collectors.toMap()的三个核心参数:
    • 键生成器:User::getId,用User的id作为Map的键
    • 值生成器:直接将当前User对象作为初始值
    • 合并函数:当遇到相同id的User时,把新User的subject全部追加到已有User的subject列表中,返回合并后的对象
  2. 如果最终需要Map<Integer, List<User>>格式,只需将合并后的User对象包装成List即可

运行结果

执行代码后输出如下:

User1 = User(1, "John", [English, Chemistry])
User2 = User(2, "Peter", [English])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:12:32