如何使用Java Collectors将Map值转换为指定结构的List?
使用Java Collectors优化JSON格式转换
你可以通过Java Stream API结合Collectors来更简洁、优雅地完成这个转换,相比forEach循环,这种方式是声明式的,代码可读性更高,也避免了手动维护列表的繁琐操作。
实现方案
方式1:使用Map临时对象(无需自定义类)
如果不想额外定义POJO,可以直接用Map.of()生成每个元素的结构,再通过Collectors收集为列表,最后包装成目标JSON的外层结构:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; import java.util.stream.Collectors; public class JsonTransformExample { public static void main(String[] args) throws Exception { // 模拟输入的Map Map<String, String> input = Map.of("k1", "v1", "k2", "v2", "k3", "v3", "k4", "v4"); // 转换为input_batch对应的列表 var inputBatchList = input.values().stream() .map(value -> Map.of("value", value)) .collect(Collectors.toList()); // 包装成最终的结构 var resultMap = Map.of("input_batch", inputBatchList); // 序列化为JSON字符串 ObjectMapper objectMapper = new ObjectMapper(); String targetJson = objectMapper.writeValueAsString(resultMap); System.out.println(targetJson); } }
方式2:使用自定义POJO(类型更安全)
如果追求类型安全,可以定义一个简单的POJO来承载每个value字段,再进行转换:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; import java.util.stream.Collectors; // 自定义POJO class ValueEntry { private String value; public ValueEntry(String value) { this.value = value; } // Jackson序列化需要getter public String getValue() { return value; } } public class JsonTransformWithPojo { public static void main(String[] args) throws Exception { Map<String, String> input = Map.of("k1", "v1", "k2", "v2", "k3", "v3", "k4", "v4"); var inputBatchList = input.values().stream() .map(ValueEntry::new) .collect(Collectors.toList()); var resultMap = Map.of("input_batch", inputBatchList); ObjectMapper objectMapper = new ObjectMapper(); String targetJson = objectMapper.writeValueAsString(resultMap); System.out.println(targetJson); } }
优势说明
- 相比forEach循环,Stream+Collectors的代码更简洁,逻辑一目了然;
- 支持并行处理(将
stream()改为parallelStream()即可,适合大数据量场景); - 避免了手动创建列表、循环添加元素的冗余代码,减少出错概率。
内容的提问来源于stack exchange,提问作者Hello All
相关产品推荐
相关产品推荐

