Java8流:将值作为列表转置映射 [英] Java8 streams : Transpose map with values as list

查看:28
本文介绍了Java8流:将值作为列表转置映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个键作为字符串和值作为列表的映射.列表可以有 10 个唯一值.我需要将此映射转换为键为整数,值为列表.示例如下:

I have map with key as String and value as List. List can have 10 unique values. I need to convert this map with key as Integer and value as List. Example as below :

输入:

Key-1":1,2,3,4

"Key-1" : 1,2,3,4

Key-2":2,3,4,5

"Key-2" : 2,3,4,5

"Key-3" : 3,4,5,1

"Key-3" : 3,4,5,1

预期输出:

1 : "Key-1","Key-3"

1 : "Key-1","Key-3"

2 : "Key-1","Key-2"

2 : "Key-1","Key-2"

3 : "Key-1", "Key-2", "Key-3"

3 : "Key-1", "Key-2", "Key-3"

4 : "Key-1", "Key-2", "Key-3"

4 : "Key-1", "Key-2", "Key-3"

5 : "Key-2", "Key-3"

5 : "Key-2", "Key-3"

我知道使用 for 循环可以实现这一点,但我需要知道这可以通过 java8 中的流/lamda 来完成.

I am aware that using for loops i can achieve this but i needed to know can this be done via streams/lamda in java8.

-谢谢.

推荐答案

一个想法是从原始映射中生成所有值-键对,然后按这些值对键进行分组:

An idea could be to generate all value-key pairs from the original map and then group the keys by these values:

import java.util.AbstractMap.SimpleEntry;

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

...

Map<Integer, List<String>> transposeMap =
    map.entrySet()
       .stream()
       .flatMap(e -> e.getValue().stream().map(i -> new SimpleEntry<>(i, e.getKey())))
       .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

这篇关于Java8流:将值作为列表转置映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆