我们如何使用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");
预期输出
C1 : 4 , C2 : 1
答案 0 :(得分:6)
对于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()));
答案 1 :(得分:2)
分两步......
List<String> all = AMap.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
Map<String, Long> result = CMap.entrySet().stream()
.collect(Collectors.groupingBy(
Entry::getValue,
Collectors.summingLong(
x -> all.stream().filter(y -> y.equals(x.getKey())).count())));
System.out.println(result); // {C1=4, C2=1}