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

如何用Java 8 Stream groupingBy按type分组TestObject集合

按JSON中的type字段分组TestObject实例的实现方案

嗨,这个需求结合JSON解析库(比如Jackson)和Java 8+的Stream API就能很优雅地实现,我给你一步步拆解具体操作:


1. 先修正JSON格式的小问题

你给出的是两个独立的JSON对象,不属于合法的JSON数组格式,所以第一步要把它转换成可解析的结构——要么手动给内容套上[]变成数组,要么逐行读取每个JSON对象解析。这里我以转换成数组的示例演示,处理后的JSON如下:

[
    { "type":"type1", "value":"value1", "param": "param1" },
    { "type":"type2", "value":"value2", "param": "param2" }
]

2. 添加Jackson依赖(以Maven为例)

我们用Jackson来解析JSON,需要先在pom.xml中添加依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 建议使用最新稳定版本 -->
</dependency>

3. 定义临时JSON承载类

你的TestObject没有type字段,所以需要一个中间类暂存JSON的所有字段:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class JsonItem {
    private String type;
    private String value;
    private String param;

    // Jackson解析需要无参构造器
    public JsonItem() {}

    // Getter方法,供Jackson和后续流操作读取字段
    public String getType() { return type; }
    public String getValue() { return value; }
    public String getParam() { return param; }
}

4. 完整的解析+分组代码

接下来是核心逻辑:解析JSON、转换成TestObject、按type分组:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingExample {
    public static void main(String[] args) throws Exception {
        // 模拟处理后的JSON数组数据
        String jsonData = "[{ \"type\":\"type1\", \"value\":\"value1\", \"param\": \"param1\" },{ \"type\":\"type2\", \"value\":\"value2\", \"param\": \"param2\" }]";

        // 1. 解析JSON为JsonItem列表
        ObjectMapper objectMapper = new ObjectMapper();
        List<JsonItem> jsonItems = objectMapper.readValue(
            jsonData,
            objectMapper.getTypeFactory().constructCollectionType(List.class, JsonItem.class)
        );

        // 2. 转换为TestObject并按type分组
        Map<String, List<TestObject>> groupedMap = jsonItems.stream()
                .map(item -> new TestObject(item.getValue(), item.getParam()))
                .collect(Collectors.groupingBy(JsonItem::getType));

        // 测试输出分组结果
        groupedMap.forEach((type, testObjects) -> {
            System.out.println("Type: " + type);
            testObjects.forEach(obj -> System.out.println("  Value: " + obj.getValue() + ", Param: " + obj.getParam()));
        });
    }
}

另外别忘了给你的TestObject添加Getter方法,否则无法读取内部字段:

public class TestObject {
    private final String value;
    private final String param;

    public TestObject(String value, String param) {
        this.value = value;
        this.param = param;
    }

    // 添加Getter方法
    public String getValue() { return value; }
    public String getParam() { return param; }
}

关键逻辑说明

  • Collectors.groupingBy(JsonItem::getType):Stream API的分组收集器,会自动将流中元素按指定键(这里是type字段)分组,对应值为该键下的TestObject列表。
  • map(item -> new TestObject(...)):将中间的JsonItem对象转换成你需要的TestObject实例,只保留value和param字段。

如果你的原始JSON是按行存储的(每行一个独立对象),只需改成逐行读取解析并加入列表,后续分组逻辑完全一致~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:03:21