使用流和 lambda 将 Map<Integer、List<String>> 拼合到 Map<String、Integer>
2022-09-02 00:38:25
我想平展一个将键与列表相关联的,而不会丢失键映射。我很好奇,好像用 和 这样做是可能的和有用的。Map
Integer
String
stream
lambda
我们从这样的东西开始:
Map<Integer, List<String>> mapFrom = new HashMap<>();
让我们假设 mapFrom 填充在某个地方,如下所示:
1: a,b,c
2: d,e,f
etc.
我们还假设列表中的值是唯一的。
现在,我想“展开”它以获得第二张地图,例如:
a: 1
b: 1
c: 1
d: 2
e: 2
f: 2
etc.
我可以像这样做(或者非常相似,使用):foreach
Map<String, Integer> mapTo = new HashMap<>();
for (Map.Entry<Integer, List<String>> entry: mapFrom.entrySet()) {
for (String s: entry.getValue()) {
mapTo.put(s, entry.getKey());
}
}
现在让我们假设我想使用 lambda 而不是嵌套循环。我可能会做这样的事情:for
Map<String, Integer> mapTo = mapFrom.entrySet().stream().map(e -> {
e.getValue().stream().?
// Here I can iterate on each List,
// but my best try would only give me a flat map for each key,
// that I wouldn't know how to flatten.
}).collect(Collectors.toMap(/*A String value*/,/*An Integer key*/))
我也尝试了一下,但我不认为这是正确的方法,因为尽管它可以帮助我摆脱维度问题,但我在这个过程中失去了关键。flatMap
简而言之,我的两个问题是:
- 是否可以使用并实现这一点?
streams
lambda
- 这样做有用(性能,可读性)吗?