tes*_*123 13 java lambda java-8 java-stream
我有一个像这样的列表:
List<Map<String, Long>>
Run Code Online (Sandbox Code Playgroud)
有没有办法,使用lambda,将此列表转换为:
Map<String, List<Long>>
Run Code Online (Sandbox Code Playgroud)
例:
Map<String, Long> m1 = new HashMap<>();
m1.put("A", 1);
m1.put("B", 100);
Map<String, Long> m2 = new HashMap<>();
m2.put("A", 10);
m2.put("B", 20);
m2.put("C", 100);
List<Map<String, Long>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);
Run Code Online (Sandbox Code Playgroud)
格式化后:
Map<String, List<Long>> afterFormatting;
Run Code Online (Sandbox Code Playgroud)
看起来像是这样的:
A -> [1, 10]
B -> [100, 20]
C -> [100]
Run Code Online (Sandbox Code Playgroud)
Tun*_*aki 14
您需要flatMap
在每个Map的条目集中创建一个Stream<Map.Entry<String, Long>>
.然后,可以使用收集groupingBy(classifier, downstream)
器收集此Stream :分类器返回条目的键,下游收集器将条目映射到其值并将其收集到a中List
.
Map<String, List<Long>> map =
list.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
Run Code Online (Sandbox Code Playgroud)
此代码需要以下静态导入:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
Run Code Online (Sandbox Code Playgroud)
以您的完整示例:
public static void main(String[] args) {
Map<String, Long> m1 = new HashMap<>();
m1.put("A", 1l);
m1.put("B", 100l);
Map<String, Long> m2 = new HashMap<>();
m2.put("A", 10l);
m2.put("B", 20l);
m2.put("C", 100l);
List<Map<String, Long>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);
Map<String, List<Long>> afterFormatting =
beforeFormatting.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
System.out.println(afterFormatting); // prints {A=[1, 10], B=[100, 20], C=[100]}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5754 次 |
最近记录: |