如何在java中通过key-> collection map进行流式处理,其中每个流元素都是密钥和集合中的每个元素?

Ali*_*aka 1 java collections hashmap java-8 java-stream

我试图压扁地图但不丢失钥匙.

我想拥有的东西:

Map<K, Collection<V>> keyToValuesMap = ...;
Stream.flattenCollection(keyToValuesMap).forEach((k,v) -> print(k, v));
Run Code Online (Sandbox Code Playgroud)

其中,v表示集合中对应于每个值的每个值k.


一个等效的旧学校Java代码将是:

for (Map.Entry<K, Collection<V>> entry : keyToValuesMap.entrySet())
{
    K k = entry.getKey();

    for (V v : entry.getValue())
    {
         print(k, v);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这个问题不仅仅是对值进行流式处理,因为它key会丢失,如下所示:keyToValuesMap.entrySet().stream().flatMap(keyValuesEntry -> keyValuesEntry.getValue().stream()).forEach(v -> printJustV(v));

*这print只是该对的一个示例动作.

*我在StreamEx中搜索过这样的API ,但找不到.我确信我会在那里找到它......

Ous*_* D. 8

没有流,这将更容易/紧凑:

map.forEach((k, v) -> v.forEach(e -> print(k, e)));
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个解决方案非常优雅(*upvote from me*) (2认同)