如何在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的解决方案: