在一个List<Object>的数组对象中,使用stream将一个字段所出现的值作为map的key,如果这个key存在,则对里面的value进行指定的数据相加,返回一个map对象,怎么实现
时间: 2024-02-20 13:58:37 浏览: 68
可以使用Java 8的Stream API来实现这个功能。具体的代码实现如下:
```
Map<String, Integer> result = list.stream()
.collect(Collectors.groupingBy(obj -> obj.getFieldName(),
Collectors.summingInt(obj -> obj.getValue())));
```
其中,`getFieldName()`是获取字段名的方法,`getValue()`是获取需要相加的值的方法。该代码将List中的对象按照`getFieldName()`获取的字段名进行分组,并对每组中所有`getValue()`获取的值进行求和,最终返回一个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函数中的转换逻辑。
阅读全文