如何在java中通过密钥流传输->;集合地图,其中每个流元素是关键,集合中的每个元素?
我想把地图展平,但不要弄丢钥匙 我想要的是:如何在java中通过密钥流传输->;集合地图,其中每个流元素是关键,集合中的每个元素?,java,collections,java-8,hashmap,java-stream,Java,Collections,Java 8,Hashmap,Java Stream,我想把地图展平,但不要弄丢钥匙 我想要的是: Map<K, Collection<V>> keyToValuesMap = ...; Stream.flattenCollection(keyToValuesMap).forEach((k,v) -> print(k, v)); 请注意,这个问题不同于仅对值进行流式处理,因为键丢失,如下所示:keyToValuesMap.entrySet().stream().flatMap(keyValuesEntry->key
Map<K, Collection<V>> keyToValuesMap = ...;
Stream.flattenCollection(keyToValuesMap).forEach((k,v) -> print(k, v));
请注意,这个问题不同于仅对值进行流式处理,因为
键
丢失,如下所示:keyToValuesMap.entrySet().stream().flatMap(keyValuesEntry->keyValuesEntry.getValue().stream()).forEach(v->printJustV(v))代码>
*print
只是这对机器上的一个示例操作
*我在中搜索了这样的API,但没有找到。我确信我会在那里找到它…您可以通过创建新的条目来保留钥匙:
keyToValuesMap.entrySet()
.stream()
.flatMap(entry -> entry.getValue()
.stream()
.map(v -> new SimpleEntry(entry.getKey(),v)))
.forEach(entry -> printEntry(entry));
您可以通过创建新的条目
s来保留密钥:
keyToValuesMap.entrySet()
.stream()
.flatMap(entry -> entry.getValue()
.stream()
.map(v -> new SimpleEntry(entry.getKey(),v)))
.forEach(entry -> printEntry(entry));
如果没有流,这将更容易/紧凑:
map.forEach((k, v) -> v.forEach(e -> print(k, e)));
如果没有流,这将更容易/紧凑:
map.forEach((k, v) -> v.forEach(e -> print(k, e)));
公共静态无效打印(地图){
map.entrySet().stream()
.flatMap(entry->entry.getValue().stream().map(value->newAbstractMap.SimpleEntry(entry.getKey(),value)))
.forEach(entry->print(entry.getKey(),entry.getValue());
}
公共静态无效打印(地图){
map.entrySet().stream()
.flatMap(entry->entry.getValue().stream().map(value->newAbstractMap.SimpleEntry(entry.getKey(),value)))
.forEach(entry->print(entry.getKey(),entry.getValue());
}
我不明白为什么要将流用于如此简单的事情
您仍然可以在实用程序类中的某个位置创建帮助器方法:
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);
}
}
}
我不明白你为什么要用流来做这么简单的事情
您仍然可以在实用程序类中的某个位置创建帮助器方法:
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);
}
}
}
虽然结果是正确的,但您并没有将值展平,而是使用不同的标准语法对元素进行迭代for@DavideLorenzoMARINO我认为更好的问题是,如果您只想打印集合中的每个键和每个元素,那么为什么首先要将其展平?我只考虑使用流式方法来扁平化结果,如果且仅当我必须通过<代码> GoGuangBui, ToMAP
对查询进行进一步细化时,才能执行更复杂的聚合。这种方法1)更高效,2)更简洁,3)更易读等…我发现这个解决方案非常优雅(向上投票)是的,不管怎样,这个解决方案是优雅的。。。我读了这个问题,我认为Flatte在标题中,但只是在对op尝试的描述中+1为me@DavideLorenzoMARINO是的,有时人们会过于关注OP的描述,但实际上,解决方案要简单得多。谢谢!虽然结果是正确的,但您并没有将值展平,而是使用不同的标准语法对元素进行迭代for@DavideLorenzoMARINO我认为更好的问题是,如果您只想打印集合中的每个键和每个元素,那么为什么首先要将其展平?我只考虑使用流式方法来扁平化结果,如果且仅当我必须通过<代码> GoGuangBui, ToMAP
对查询进行进一步细化时,才能执行更复杂的聚合。这种方法1)更高效,2)更简洁,3)更易读等…我发现这个解决方案非常优雅(向上投票)是的,不管怎样,这个解决方案是优雅的。。。我读了这个问题,我认为Flatte在标题中,但只是在对op尝试的描述中+1为me@DavideLorenzoMARINO是的,有时人们会过于关注OP的描述,但实际上,解决方案要简单得多。谢谢!为什么要收集(Collectors.toList())
?请参阅Eran的解决方案:为什么要收集(Collectors.toList())?参见Eran的解决方案: