取List<Map>中具体key的所有值 使用stream
时间: 2024-03-12 17:48:08 浏览: 500
使用Java 8中的Stream API,可以更简洁地实现遍历List中每一个Map,获取指定key的值,并将其存储到新的List中的操作。示例代码如下:
```java
public List<Object> getListOfValuesByKey(List<Map<String, Object>> list, String key) {
return list.stream()
.map(map -> map.get(key))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
```
其中,`list`为包含多个`Map`的列表,`key`为要获取值的`Map`中的键名,返回的`List`为所有值的列表。使用`stream()`将`List`转换成流,然后使用`map()`对每一个`Map`获取指定key的值,使用`filter()`过滤掉值为`null`的元素,最后使用`collect()`将流转换成列表并返回。
相关问题
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>>类型。
Java8实现:Stream<A>和Stream<B>按照Function<T,List<Object>>、Function<U,List<Object>>进行匹配,将匹配成功的Stream<A>和Stream<B>以List<Pair<A,B>>的形式返回。已知Stream<A>和Stream<B>已经按匹配key排好序了,要求减少嵌套循环来提高性能
可以通过flatMap、groupingBy和reduce方法来实现该功能,具体代码如下:
```java
public static <A, B, T> List<Pair<A, B>> matchStreams(
Stream<A> streamA,
Stream<B> streamB,
Function<A, List<T>> keyExtractorA,
Function<B, List<T>> keyExtractorB) {
Map<List<T>, List<A>> mapA = streamA.collect(Collectors.groupingBy(keyExtractorA));
return streamB.flatMap(b -> {
List<T> keyB = keyExtractorB.apply(b);
List<A> listA = mapA.get(keyB);
return listA == null ? Stream.empty()
: listA.stream().map(a -> new Pair<>(a, b));
}).collect(Collectors.toList());
}
```
该方法中,首先将Stream<A>按照keyExtractorA提取出的key进行分组,生成一个Map<List<T>, List<A>>,其中key是List<T>,value是List<A>。
接着,对于Stream<B>中的每个元素b,通过keyExtractorB提取出对应的keyB,从上一步生成的Map中取出对应的List<A>,将其转换为Stream<Pair<A, B>>并返回。
最后,将所有的Stream<Pair<A, B>>合并为一个Stream,并通过toList方法生成List<Pair<A, B>>。
该实现可以避免嵌套循环,提高性能。同时,由于使用了Stream API和Lambda表达式,代码也更加简洁易懂。
阅读全文