Java 将List<Map<String, Object>>类型的数据根据material_code分组生成新的Map<String, List<Map<String, Object>>>数据,并且不要与源数据指向同一个地址,使用lambda
时间: 2024-09-10 08:22:59 浏览: 44
List<Map<String, Object>>转化为List<JavaBean>工具类
4星 · 用户满意度95%
在Java中,要实现根据`material_code`字段将`List<Map<String, Object>>`类型的数据分组到新的`Map<String, List<Map<String, Object>>>`中,并且确保分组后的数据与源数据不指向同一个地址,可以使用Stream API结合lambda表达式来完成。下面是一个示例代码:
```java
import java.util.*;
import java.util.stream.Collectors;
public class GroupingExample {
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
// 假设已经添加了一些Map元素到list中
Map<String, List<Map<String, Object>>> groupedMap = groupByMaterialCode(list);
// 打印分组后的结果
System.out.println(groupedMap);
}
public static Map<String, List<Map<String, Object>>> groupByMaterialCode(List<Map<String, Object>> list) {
return list.stream()
.collect(Collectors.groupingBy(
map -> map.getOrDefault("material_code", "").toString(), // 获取material_code作为分组键
Collectors.mapping(map -> new HashMap<>(map), Collectors.toList()) // 对每个元素创建一个新的HashMap副本
));
}
}
```
在这个示例中,我们首先定义了一个`groupByMaterialCode`方法,它接收一个`List<Map<String, Object>>`作为参数。通过调用`stream()`方法,我们创建了一个流,然后使用`collect()`方法结合`Collectors.groupingBy()`来按`material_code`进行分组。
在`groupingBy()`中,我们通过`map -> map.getOrDefault("material_code", "").toString()`获取了分组键。对于收集到的每个元素,我们使用`Collectors.mapping()`创建了一个新的`HashMap`副本,这样可以确保分组后的列表与源列表中的元素不指向同一个地址。`new HashMap<>(map)`这个构造函数会创建一个参数`map`的浅拷贝,从而避免了共享引用的问题。
请注意,由于`map`中的值可能是基本类型或其包装类,所以在使用`getOrDefault`方法时需要注意,这里假设`material_code`是一个对象,如果它是基本类型,则需要进行相应的调整。
阅读全文