转换地图<string,list <integer =“”>&gt; to map <string,int [] =“”>

时间:2018-04-16 20:08:11

标签: java lambda java-8

拥有如下数据地图:

Map<String, List<Integer>> dataMap = ....

我想将其转换为另一张地图

下面,我尝试过的解决方案

Map<String, int[]> dataMapOut = new HashMap<>();
dataMap.entrySet().stream().forEach(entry -> {
    String key = entry.getKey();
    int[] val = entry.getValue().stream().mapToInt(i -> i).toArray();
    dataMapOut.put(key, val);
});

寻找更好,更简洁的映射方式?

3 个答案:

答案 0 :(得分:8)

您正在寻找toMap collector

 Map<String, int[]> result = dataMap.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey,
                    e -> e.getValue()
                            .stream()
                            .mapToInt(Integer::intValue)
                            .toArray()));

答案 1 :(得分:2)

使用流,使用Collectors.toMapArrays.setAll从每个List创建数组:

Map<String, int[]> dataMapOut = dataMap.entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        e -> {
            int[] arr = new int[e.getValue().size()];
            Arrays.setAll(arr, e.getValue()::get);
            return arr;
        }));

没有信息流,使用Map.forEachArrays.setAll

Map<String, int[]> dataMapOut = new HashMap<>();
dataMap.forEach((k, v) -> {
    int[] arr = new int[v.size()];
    Arrays.setAll(arr, v::get);
    dataMapOut.put(k, arr);
});

或者,如果你想要简洁:

Map<String, int[]> map = new HashMap<>();
dataMap.forEach((k, v) -> map.put(k, v.stream().mapToInt(i -> i).toArray()));

答案 2 :(得分:1)

另一种解决方案可能是这样的:

Map<String,int[]> result= map.entrySet()
        .stream()
        .map(m->new AbstractMap.SimpleImmutableEntry<>(m.getKey(),m.getValue()
                   .stream()
                   .mapToInt(Integer::intValue)
                   .toArray()))
        .collect(Collectors.toMap(Map.Entry::getKey,entry->entry.getValue(),(e1,e2)->e1,LinkedHashMap::new));