如何用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
相关产品推荐
相关产品推荐

