for*_*rtm 4 java-8 java-stream
我们如何使用java 8 streams api来获得预期的输出
A1有B1,B2
A2有B1,B2,B3
B1,B2属于C1
B3属于C2
因此,对于C1,计数应该是4作为B1,B2出现4次
同样,C2的计数将是1,因为B3出现1次
List<String> A= new ArrayList<>();
A.add("A1");
A.add("A2");
Map<String, List<String>> AMap = new HashMap<>();
AMap.put("A1", Arrays.asList("B1", "B2"));
AMap.put("A2", Arrays.asList("B1", "B2", "B3"));
Map<String, String> BMap = new HashMap<>();
CMap.put("B1", "C1");
CMap.put("B2", "C1");
CMap.put("B3", "C2");
Run Code Online (Sandbox Code Playgroud)
预期产出
C1 : 4 , C2 : 1
Run Code Online (Sandbox Code Playgroud)
对于A列表中的每个键,我将获取每个B键,它将从CMap中获取每个C值.然后对流进行flatmap,按标识分组并计算值.
import static java.util.Collections.emptyList;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
...
Map<String, Long> res = A.stream()
.flatMap(a -> AMap.getOrDefault(a, emptyList()).stream().map(BMap::get))
.collect(groupingBy(identity(), counting()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |