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))); } }
代码逻辑说明
Collectors.toMap()的三个核心参数:- 键生成器:
User::getId,用User的id作为Map的键 - 值生成器:直接将当前User对象作为初始值
- 合并函数:当遇到相同id的User时,把新User的subject全部追加到已有User的subject列表中,返回合并后的对象
- 键生成器:
- 如果最终需要
Map<Integer, List<User>>格式,只需将合并后的User对象包装成List即可
运行结果
执行代码后输出如下:
User1 = User(1, "John", [English, Chemistry]) User2 = User(2, "Peter", [English])
内容的提问来源于stack exchange,提问作者santro
相关产品推荐
相关产品推荐

