我正在尝试展平地图,但不会丢失钥匙。
我想拥有的东西
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,但找不到。我确定会在那找到它...
答案 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));