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

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)

Ale*_* C. 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()));
Run Code Online (Sandbox Code Playgroud)

  • 哦,这很好! (6认同)