使用java 8 streams api进行嵌套查找

时间:2018-02-08 14:20:43

标签: 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");

预期输出

        C1 : 4 , C2 : 1

2 个答案:

答案 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}