java 8将多个键映射到同一个值

java 8将多个键映射到同一个值,java,dictionary,java-8,java-stream,key,Java,Dictionary,Java 8,Java Stream,Key,我正在寻找一些方便的方法来创建下面的地图。我有一个包含此类字段的对象(示例) 我是这样做的 object1.supportedKeys.forEach(k->map.put(k, object1)) object2.supportedKeys.forEach(k->map.put(k, object2)) 但是我觉得还有更有效的方法。给定对象的列表(或任何集合),您可以在元素上流,使用平面映射生成键和值对,并收集到映射 这可以在一条语句中完成,而不考虑对象的数量 List.of(o

我正在寻找一些方便的方法来创建下面的地图。我有一个包含此类字段的对象(示例)

我是这样做的

object1.supportedKeys.forEach(k->map.put(k, object1))
object2.supportedKeys.forEach(k->map.put(k, object2))
但是我觉得还有更有效的方法。

给定对象的
列表(或任何
集合
),您可以
在元素上流
,使用
平面映射
生成键和值对,并收集到
映射

这可以在一条语句中完成,而不考虑对象的数量

List.of(object1,object2)
    .stream()
    .flatMap(o -> o.supportedKeys
                   .stream()
                   .map(k -> new SimpleEntry<>(k,o)))
    .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
List.of(object1,object2)
.stream()
.flatMap(o->o.supportedKeys
.stream()
.map(k->newsimplentry(k,o)))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

您认为什么是无效的?如果您要通过
A
B
C
D
进行查找,则仅此而已。如果两个
集合
都包含相同的
字符串
,该怎么办
Object2
应该是值吗?@michalk不允许,如果发生这种情况,代码中就有错误。这是一个例外的场景
效率更高
?为什么不直接
流而不是创建无用的
列表
?@Rono好吧,这似乎比实际编写同一条语句两次(或者如果有两个以上的对象要处理多次)更干净。@michalk你对OP的示例是正确的,但我假设一个更一般的输入已经在一些集合中出现。
object1.supportedKeys.forEach(k->map.put(k, object1))
object2.supportedKeys.forEach(k->map.put(k, object2))
List.of(object1,object2)
    .stream()
    .flatMap(o -> o.supportedKeys
                   .stream()
                   .map(k -> new SimpleEntry<>(k,o)))
    .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));