如何在Java 8中将Map中的列表扁平化

8

如何从整数的地图转换为字符串列表,例如:

<1, ["a", "b"]>,
<2, ["a", "b"]>

针对像以下扁平化字符串列表的情况:

["1-a", "1-b", "2-a", "2-b"]

在 Java 8 中是什么意思?
2个回答

10
您可以将flatMap用于值的操作:
map.values()
   .stream()
   .flatMap(List::stream)
   .collect(Collectors.toList());

或者,如果您要利用地图条目,可以使用 Holger 指出的代码:

map.entries()
   .stream()
   .flatMap(e -> e.getValue().stream().map(s -> e.getKey() + s))
   .collect(Collectors.toList());

谢谢。我应该以正确的复杂度水平提出问题。实际上,在将条目收集到列表之前,我需要对它们进行操作。假设我想以“mapKey-listItem”的格式构建字符串,例如“1-a”,那么最终我将得到[1-a, 1-b, 2-c, 2-d],我该如何在flatMap()函数中编写该功能?相应地编辑我的问题... - Rodrigo
4
@Rodrigo map.entries().stream().flatMap(e->e.getValue().stream().map(s->e.getKey()+s))…。通常情况下,现在你已经有了一些指引,应该自己尝试并在遇到某些具体细节时回来提问。 - Holger
@Holger 谢谢。你们两个答案的结合解决了我的问题。我应该接受这个答案还是等待 Naman 将你的代码添加到答案中再接受它? - Rodrigo
好的,我会等到@Naman编辑完它。我认为让大家在答案中看到整个解决方案比阅读这些评论更容易。谢谢你们两个! - Rodrigo
@Rodrigo 已更新。请注意:方法仍然相同,但根据需求的变化,实现方式已有所不同。 - Naman

2

你只需这样做:

最初的回答:

List<String> result = map.entrySet().stream()
        .flatMap(entry -> entry.getValue().stream().map(string -> entry.getKey() + "-" + string))
        .collect(Collectors.toList());

这会遍历地图中的所有条目,将所有值与其键连接并将其收集到新列表中。
结果将是:
[1-a, 1-b, 2-a, 2-b]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接