我想转换一个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
在第一个映射中不包含键。
有什么想法吗?
答案 0 :(得分:4)
流式处理对象列表并提取所需的键,然后var test1 = new Test();
test1.start();
var test2 = new Test();
test2.start();
-> 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()
注意:上面的代码使用源映射键作为结果映射的值,因为这似乎是您在帖子中要说明的内容,但是如果您希望保留源映射的键作为结果映射的键,然后将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())
。
答案 1 :(得分:1)
如果偏好是在映射为键的多个值中选择 any ,则可以简单地使用:
Map<String, List<YourObject>> existing = new HashMap<>();
Map<String, String> output = new HashMap<>();
existing.forEach((k, v) -> v.forEach(v1 -> output.put(v1.getMyKey(), k)));
本质上,这会将myKey
之类的“第一个”及其对应的值(即现有地图的key
)放在