是否有更好的方法来转换" Map< String,Collection< String>>" to" Map< String,List< String>>"?
Map<String, Collection<String>> collectionsMap = ...
Map<String, List<String>> listsaps =
collectionsMap.entrySet().stream()
.collect(Collectors.<Map.Entry<String, Collection<String>>,
String, List<String>>toMap(
Map.Entry::getKey,
e -> e. getValue().stream().collect(Collectors.toList())
)
);
感谢您帮助我们改进
答案 0 :(得分:4)
对于这样的情况,我会考虑使用Map.forEach
来执行使用副作用的操作。地图上的流有点麻烦,因为需要编写额外的代码来流式传输地图条目,然后从每个条目中提取密钥和值。相比之下,Map.forEach
将每个键和值作为单独的参数传递给函数。这是看起来像:
Map<String, Collection<String>> collectionsMap = ...
Map<String, List<String>> listsaps = new HashMap<>(); // pre-size if desired
collectionsMap.forEach((k, v) -> listsaps.put(k, new ArrayList<>(v)));
如果您的地图很大,您可能希望预先调整目的地的大小,以避免在其人口中重新散列。要正确执行此操作,您必须知道HashMap
将存储桶的数量,而不是元素的数量作为其参数。这需要除以默认的载荷因子0.75,以便在给定一定数量的元素的情况下适当地预先确定尺寸:
Map<String, List<String>> listsaps = new HashMap<>((int)(collectionsMap.size() / 0.75 + 1));
答案 1 :(得分:3)
1)在Collectors.toMap()
中,您不需要重复通用类型,因为这些是推断的。
所以:
collect(Collectors.<Map.Entry<String, Collection<String>>,
String, List<String>>toMap(...)
可以替换为:
collect(Collectors.toMap(...)
2)将集合转换为List的方式也可以简化。
这:
e -> e. getValue().stream().collect(Collectors.toList())
可以写成:
e -> new ArrayList<>(e.getValue())
你可以写:
Map<String, List<String>> listsaps =
collectionsMap.entrySet()
.stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> new ArrayList<>(e.getValue())
)
);
答案 2 :(得分:1)
我认为这更容易阅读:
Map<String, List<String>> listsaps = new HashMap<>();
collectionsMap.entrySet()
.stream()
.forEach(e -> listsaps.put(e.getKey(), new ArrayList<>(e.getValue())));
如果您只想将条目转换为列表,但并不真正关心更改集合的类型,那么您可以使用map.replaceAll
:
collectionsMap.replaceAll((k, v) -> new ArrayList<>(v));