在Java中,如何通过key-> collection映射流式传输,其中每个流式传输的元素都是键,而集合中的每个元素呢?

时间:2018-12-13 13:00:55

标签: java collections java-8 hashmap java-stream

我正在尝试展平地图,但不会丢失钥匙。

我想拥有的东西

v

Map<K, Collection<V>> keyToValuesMap = ...; Stream.flattenCollection(keyToValuesMap).forEach((k,v) -> print(k, v)); 代表集合中每个v对应的每个值。


等效的老式Java代码为:

k

请注意,此问题与仅流式传输值不同,因为for (Map.Entry<K, Collection<V>> entry : keyToValuesMap.entrySet()) { K k = entry.getKey(); for (V v : entry.getValue()) { print(k, v); } } 丢失了,像这样:key

* keyToValuesMap.entrySet().stream().flatMap(keyValuesEntry -> keyValuesEntry.getValue().stream()).forEach(v -> printJustV(v));只是该对上的一个示例动作。

*我在StreamEx中搜索了这样的API,但找不到。我确定会在那找到它...

4 个答案:

答案 0 :(得分:8)

如果没有流,这会更容易/紧凑:

map.forEach((k, v) -> v.forEach(e -> print(k, e)));

答案 1 :(得分:4)

您可以通过创建新的Entry来保留密钥:

keyToValuesMap.entrySet()
              .stream()
              .flatMap(entry -> entry.getValue()
                                     .stream()
                                     .map(v -> new SimpleEntry(entry.getKey(),v)))
              .forEach(entry -> printEntry(entry));

答案 2 :(得分:0)

<table>
    <tr>
        <th>Key</th><th>Data</th>
    </tr>
    {% for index, key in L10_DATA.data_key %}
    <tr>
        <td>{{ key }}</td><td>{{ L10_DATA.data[index] }}</td>
    <tr>
    {% endfor %}
</table>

答案 3 :(得分:0)

我不明白为什么您要使用Streams这样简单的东西。

您仍然可以在实用程序类中的某个位置创建辅助方法:

public static <K, V> void forEachElement(
    Map<? extends K, ? extends Collection<? extends V>> map, 
    BiConsumer<? super K, ? super V> action
){
    for (Map.Entry<? extends K, ? extends Collection<? extends V>> entry : map.entrySet()){
        K k = entry.getKey();
        for (V v : entry.getValue()) {
             action.accept(k, v);
        }
    }
}

然后可以这样称呼它:

SomeUtilClass.forEachElement(keyToValuesMap, (k, v) -> print(k, v));