拥有如下数据地图:
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);
});
寻找更好,更简洁的映射方式?
答案 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.toMap
和Arrays.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.forEach
和Arrays.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));