我想转换一个 Map<String, List<Object>>
所以它变成了Map<String, String>
.如果它只是 Map<String, Object>
在 Java8 中很容易;
stream().collect(k -> k.getValue().getMyKey(), Entry::getKey);
但这行不通,因为 getValue 返回一个列表 Map<List<Object>, String>
在我的例子中。假设 Object 包含一个用于键的 getter 并且 Object
不包含第一个映射中的键。
有什么想法吗?
最佳答案
流过对象列表并提取您需要的 key ,然后 map
--> flatten
--> toMap
source.entrySet()
.stream()
.flatMap(e -> e.getValue()
.stream()
.map(x -> new SimpleEntry<>(x.getMyKey(), e.getKey())))
.collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));
如果预期存在重复,请使用合并功能 getMyKey()
值(value)观:
source.entrySet()
.stream()
.flatMap(e -> e.getValue()
.stream()
.map(x -> new SimpleEntry<>(x.getMyKey(), e.getKey())))
.collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue, (l, r) -> l));
注意:上面使用源映射键作为结果映射的值,因为这似乎是您在帖子中说明的内容,但是如果您希望保留源映射的键作为结果映射的键,然后更改 new SimpleEntry<>(x.getMyKey(), e.getKey())
至 new SimpleEntry<>(e.getKey(),x.getMyKey())
.
关于java - getValue 返回列表的反向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53498793/