反向映射,其中getValue返回一个列表

时间:2018-11-27 11:37:13

标签: java java-8 hashmap inverse

我想转换一个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在第一个映射中不包含键。

有什么想法吗?

2 个答案:

答案 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)放在