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

如何在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));
    }
}

关键逻辑说明

  1. 分组处理:通过Collectors.groupingBy(User::getParentUserId)将users列表按parent_user_id聚合,得到键为ID、值为对应用户列表的Map。
  2. 对象复制:使用自定义的复制构造方法,复用原Group对象的所有非users属性,仅替换为当前分组的用户列表,生成新的Group对象。
  3. JSON互转:用Jackson的ObjectMapper完成JSON和Java对象的转换,实际项目中如果直接从数据库获取实体类,可跳过JSON解析步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:21:49