gpt4 book ai didi

java - 如何将 Stream>> 合并为一个 Map>?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:19 25 4
gpt4 key购买 nike

我正在尝试合并 Stream<Map<String, Map<String, String>>>对象与所有 Streams 中的键一起映射到单个映射中.

例如,

final Map<String, someOtherObjectToProcess> someObject;

final List<Map<String, Map<String, String>>> list = someObject.entrySet()
.stream()
.flatMap(this::getInfoStream)
.collect(Collectors.toList());

getInfoStream 的签名是

public Stream<Map<String, Map<String, String>>> getInfoStream(Map.Entry<String, someOtherObjectToProcess> entry)

如果我使用 (Collectors.toList())我能够获得这些 map 对象的列表。

如果我使用上面的代码,示例输出:

[{
"name" : {
"property":"value"
}
},

{
"name2" : {
"property":"value"
}
}]

但是我想收集到一个具有结构的Map

{
"name" : {
"property":"value"
},
"name2" : {
"property":"value"
}
}

前提是 key 是唯一的。

我如何使用 Collectors.toMap() 或任何其他替代方法来做到这一点?

最佳答案

当你有

Stream<Map<String, Map<String, String>>> stream = ...

(我假设是 .flatMap(this::getInfoStream) 的结果)你可以调用

.flatMap(map -> map.entrySet().stream())

从所有将产生 Stream<Map.Entry<String, Map<String, String>>> 的 map 创建条目流.

现在,您需要从该流中收集 映射中每个条目的键和值。假设每个键在您可以使用的所有 map 中都是唯一的

.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

但是如果键不是唯一的,你需要决定什么值应该放在新映射中相同的键。我们可以通过填写...来完成参与

.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (vOld, vNew) -> ...));
// ^^^

哪里vOld保存当前保存在相同键下的结果映射中的值,并且 vNew保存新值(来自当前流“迭代”)。
例如,如果您想忽略新值,您可以简单地返回 (vOld, vNew) -> vOld 持有的旧值/当前值。

简而言之(假设唯一键):

Map<String, Map<String, String>> combinedMap = 
/*your Stream<Map<String, Map<String, String>>>*/
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

关于java - 如何将 Stream<Map<String, Map<String, String>>> 合并为一个 Map<String, Map<String, String>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505925/

25 4 0