java list<map> stream流 按多个字段分组
时间: 2023-04-03 18:05:02 浏览: 216
可以使用Java 8中的Stream API,使用Collectors.groupingBy()方法按照多个字段进行分组。例如,假设我们有一个List<Map<String, Object>>,其中每个Map都包含两个字段:name和age。我们想按照这两个字段进行分组,可以使用以下代码:
List<Map<String, Object>> list = new ArrayList<>();
// 假设list中有多个Map对象,每个Map对象都包含name和age两个字段
Map<String, Map<Integer, List<Map<String, Object>>>> result = list.stream()
.collect(Collectors.groupingBy(
m -> m.get("name").toString(),
Collectors.groupingBy(
m -> Integer.parseInt(m.get("age").toString())
)
));
这将返回一个Map对象,其中键是name字段的值,值是另一个Map对象,其中键是age字段的值,值是具有相同name和age值的Map对象的列表。
相关问题
Java中通过stream流将两个List<Map>通过相同某字段合并成一个List<Map>其他的值相加
可以使用Java 8中的Stream API来实现。假设要合并的两个List<Map>分别为list1和list2,合并的字段为"field",其他的值需要相加。代码如下:
```java
List<Map<String, Object>> result = Stream.concat(list1.stream(), list2.stream())
.collect(Collectors.groupingBy(map -> map.get("field")))
.entrySet().stream()
.map(entry -> {
Map<String, Object> map = new HashMap<>();
map.put("field", entry.getKey());
map.put("value", entry.getValue().stream()
.mapToInt(map -> (int) map.getOrDefault("value", 0))
.sum());
return map;
})
.collect(Collectors.toList());
```
这段代码首先使用Stream.concat()将两个List合并为一个Stream,然后使用Collectors.groupingBy()方法按照"field"字段进行分组,得到一个Map<String, List<Map<String, Object>>>类型的结果。接着使用entrySet()方法将Map转化为Set,然后再次使用Stream流处理每个分组,将"field"字段和其他字段的值相加,最后使用Collectors.toList()方法将结果转化为List<Map<String, Object>>类型。
JAVA实现List<Object>转成List<Map>方法
可以使用Java 8的Stream API来实现List<Object>转成List<Map>的方法。
假设List<Object>的元素类型是MyObject,其中包含两个字段name和age,我们需要将其转成List<Map>,其中每个Map对应一个MyObject对象,key为name,value为age。
代码如下:
```java
List<Object> list = new ArrayList<>();
list.add(new MyObject("John", 25));
list.add(new MyObject("Mary", 30));
List<Map<String, Object>> result = list.stream()
.map(obj -> {
MyObject myObj = (MyObject) obj;
Map<String, Object> map = new HashMap<>();
map.put("name", myObj.getName());
map.put("age", myObj.getAge());
return map;
})
.collect(Collectors.toList());
```
其中,map函数将一个MyObject对象转成一个Map对象,collect函数将所有的Map对象收集到一个List中。
需要注意的是,如果List<Object>中包含的元素类型不是MyObject,需要根据实际情况修改map函数中的转换逻辑。