如何使用lambda获取哈希映射中值的键数

pri*_*iya 3 java lambda hashmap java-8 java-stream

我有一个哈希映射

Map<Integer, List<String>> Directmap = new HashMap<Integer, List<String>>() {{
    put(0, Arrays.asList(a, b));
    put(1, Arrays.asList(b, c));
    put(2, Arrays.asList(d));
    put(3, Arrays.asList(d, e));
    put(4, Arrays.asList(e));
    put(5, Arrays.asList());
}};
Run Code Online (Sandbox Code Playgroud)

Directmap: {0=[a, b], 1=[b, c], 2=[d], 3=[d, e], 4=[e], 5=[]}

我想计算每个值的键数.例如:"a"有一个键,"b"有两个键,......,"e"有两个键,即3和4.

我试过这样的事情:

Map<Object, Long> ex = Directmap.entrySet().stream()
            .collect(Collectors.groupingBy(e -> e.getKey(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

我希望带有键数的值作为输出.像这样 :

a=[1], b=[2], c=[1], d=[2], e=[2]
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 7

您可以通过平面映射地图的每个值来完成此操作.

在此代码中,仅保留映射的值(因为您对键不感兴趣).每个值,都是一个List<String>平面映射,以便Stream管道Stream<List<String>>成为Stream<String>.最后,Stream通过(groupingBy)对身份函数进行分组,对元素执行的减少只是计算出现次数(counting()).

Map<String, Long> ex = 
      Directmap.values()
               .stream()
               .flatMap(Collection::stream)
               .collect(Collectors.groupingBy(v -> v, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

请注意,如果某个值在初始地图中出现两次,则它也会计算两次.如果要计算不同值的数量,可以distinct()在收集结果之前添加一个调用(或使用Set而不是a List).