Java 8 使用Java8StreamsAPI进行嵌套查找

Java 8 使用Java8StreamsAPI进行嵌套查找,java-8,java-stream,Java 8,Java Stream,我们如何使用Java8StreamsAPI在这里获得预期的输出 A1有B1,B2 A2有B1,B2,B3 B1、B2属于C1 B3属于C2 因此,对于C1,计数应为4,因为B1,B2出现4次 同样,当B3出现1次时,C2的计数将为1 List<String> A= new ArrayList<>(); A.add("A1"); A.add("A2"); Map<String, List<Stri

我们如何使用Java8StreamsAPI在这里获得预期的输出

A1有B1,B2
A2有B1,B2,B3

B1、B2属于C1
B3属于C2

因此,对于C1,计数应为4,因为B1,B2出现4次
同样,当B3出现1次时,C2的计数将为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");
分两步

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}
List all=AMap.values()
.stream()
.flatMap(集合::流)
.collect(Collectors.toList());
映射结果=CMap.entrySet().stream()
.collect(收集器.groupingBy(
条目::getValue,
我的名字叫summingLong(
x->all.stream().filter(y->y.equals(x.getKey()).count());
System.out.println(结果);//{C1=4,C2=1}

对于A列表中的每个键,我将获取每个B键,它将从CMap中获取每个C值。然后平面映射流,按标识分组并计算值

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()));
导入静态java.util.Collections.emptyList;
导入静态java.util.function.function.identity;
导入静态java.util.stream.Collectors.counting;
导入静态java.util.stream.Collectors.groupingBy;
...
Map res=A.stream()
.flatMap(a->AMap.getOrDefault(a,emptyList()).stream().map(BMap::get))
.收集(分组方式(标识(),计数());

哦,这太好了!
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()));