如何在Java中按嵌套对象元素拆分ArrayList中的对象
Java按
parent_user_id拆分对象列表实现方案 你需要将从数据库获取的对象列表,按内部users数组中对象的parent_user_id分组,生成多个保留原对象其他属性的新对象——每组相同parent_user_id的user会被归到一个新对象的users列表中。以下是具体实现步骤:
1. 定义对应实体类
首先创建两个实体类,对应JSON结构中的外层对象和内部用户对象,这里用Jackson的注解处理JSON字段名和Java属性名的映射:
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; // 外层分组对象 public class Group { @JsonProperty("_id") private String id; private String name; private String description; private List<User> users; // 复制构造方法:复用原对象属性,替换users列表 public Group(Group original, List<User> newUsers) { this.id = original.id; this.name = original.name; this.description = original.description; this.users = newUsers; } // 无参构造方法(Jackson序列化/反序列化必需) public Group() {} // Getter、Setter方法,可使用Lombok的@Data注解简化 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } } // 内部用户对象 public class User { private String id; private String owner; @JsonProperty("purchase_date") private String purchaseDate; private String status; @JsonProperty("parent_user_id") private String parentUserId; private String dt; // 无参构造方法、Getter、Setter方法,可使用Lombok简化 public User() {} public String getId() { return id; } public void setId(String id) { this.id = id; } public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public String getPurchaseDate() { return purchaseDate; } public void setPurchaseDate(String purchaseDate) { this.purchaseDate = purchaseDate; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getParentUserId() { return parentUserId; } public void setParentUserId(String parentUserId) { this.parentUserId = parentUserId; } public String getDt() { return dt; } public void setDt(String dt) { this.dt = dt; } }
2. 实现分组拆分逻辑
利用Java 8+的Stream API完成分组,再为每个分组生成新的Group对象:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class GroupSplitHandler { public static void main(String[] args) throws Exception { // 模拟从数据库获取的JSON数据(实际项目可直接用DB查询到的实体类列表) String dbJson = "[\n" + " {\n" + " \"_id\" : \"63a8808652f40e1d48a3d1d7\",\n" + " \"name\" : \"A\",\n" + " \"description\" : null,\n" + " \"users\" : [\n" + " {\n" + " \"id\" : \"63a8808c52f40e1d48a3d1da\",\n" + " \"owner\" : \"John Doe\",\n" + " \"purchase_date\" : \"2022-12-25\",\n" + " \"status\" : \"active\",\n" + " \"parent_user_id\" : \"63a8808c52f40e1d48a3d1da\"\n" + " },\n" + " {\n" + " \"id\" : \"63a880a552f40e1d48a3d1dc\",\n" + " \"owner\" : \"John Doe 1\",\n" + " \"purchase_date\" : \"2022-12-25\",\n" + " \"parent_user_id\" : \"63a8808c52f40e1d48a3d1da\"\n" + " },\n" + " {\n" + " \"id\" : \"63a880f752f40e1d48assddd\",\n" + " \"owner\" : \"John Doe 2\",\n" + " \"purchase_date\" : \"2022-12-25\",\n" + " \"parent_user_id\" : \"63a8808c52f40e1d48a3d1da\"\n" + " },\n" + " {\n" + " \"id\" : \"63a880f752f40e1d48a3d207\",\n" + " \"owner\" : \"John Doe 11\",\n" + " \"dt\" : \"2022-12-25\",\n" + " \"status\" : \"inactive\",\n" + " \"parent_user_id\" : \"63a880f752f40e1d48a3d207\"\n" + " },\n" + " {\n" + " \"id\" : \"63a880f752f40e1d48agfmmb\",\n" + " \"owner\" : \"John Doe 112\",\n" + " \"dt\" : \"2022-12-25\",\n" + " \"status\" : \"active\",\n" + " \"parent_user_id\" : \"63a880f752f40e1d48agfmmb\"\n" + " },\n" + " {\n" + " \"id\" : \"63a880f752f40e1d48agggg\",\n" + " \"owner\" : \"John SS\",\n" + " \"dt\" : \"2022-12-25\",\n" + " \"status\" : \"inactive\",\n" + " \"parent_user_id\" : \"63a880f752f40e1d48agggg\"\n" + " },\n" + " {\n" + " \"id\" : \"63a880f752f40e1d487777\",\n" + " \"owner\" : \"John SS\",\n" + " \"dt\" : \"2022-12-25\",\n" + " \"parent_user_id\" : \"63a880f752f40e1d48agggg\"\n" + " }\n" + " ]\n" + " }\n" + "]"; // 将JSON转为Group对象列表 ObjectMapper objectMapper = new ObjectMapper(); List<Group> originalGroups = objectMapper.readValue( dbJson, objectMapper.getTypeFactory().constructCollectionType(List.class, Group.class) ); // 处理拆分逻辑 List<Group> resultGroups = new ArrayList<>(); for (Group original : originalGroups) { // 按parent_user_id对users分组 Map<String, List<User>> groupedUsers = original.getUsers().stream() .collect(Collectors.groupingBy(User::getParentUserId)); // 为每个分组创建新的Group对象 for (Map.Entry<String, List<User>> entry : groupedUsers.entrySet()) { resultGroups.add(new Group(original, entry.getValue())); } } // 输出结果(转为格式化JSON) System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(resultGroups)); } }
关键逻辑说明
- 分组处理:通过
Collectors.groupingBy(User::getParentUserId)将users列表按parent_user_id聚合,得到键为ID、值为对应用户列表的Map。 - 对象复制:使用自定义的复制构造方法,复用原
Group对象的所有非users属性,仅替换为当前分组的用户列表,生成新的Group对象。 - JSON互转:用Jackson的
ObjectMapper完成JSON和Java对象的转换,实际项目中如果直接从数据库获取实体类,可跳过JSON解析步骤。
内容的提问来源于stack exchange,提问作者BlackWooDZZ
相关产品推荐
相关产品推荐

