代码之家  ›  专栏  ›  技术社区  ›  AlikElzin-kilaka planben

如何在Java中通过键->集合映射,其中每个流元素是集合中的密钥和每个元素?

  •  1
  • AlikElzin-kilaka planben  · 技术社区  · 7 年前

    我正试着把地图弄平,但没有把钥匙弄丢。

    我想要的是:

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

    在哪里? v 表示集合中对应于每个 k .


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

    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));

    *的 print 只是一个例子。

    *我在 StreamEx ,但找不到。我确信我会在那里找到它…

    4 回复  |  直到 7 年前
        1
  •  4
  •   Eran    7 年前

    您可以通过创建新的 Entry S:

    keyToValuesMap.entrySet()
                  .stream()
                  .flatMap(entry -> entry.getValue()
                                         .stream()
                                         .map(v -> new SimpleEntry(entry.getKey(),v)))
                  .forEach(entry -> printEntry(entry));
    
        2
  •  8
  •   Ousmane D.    7 年前

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

    map.forEach((k, v) -> v.forEach(e -> print(k, e)));
    
        3
  •  0
  •   Oleg Cherednik    7 年前
    public static <K, V> void print(Map<K, Collection<V>> map) {
        map.entrySet().stream()
           .flatMap(entry -> entry.getValue().stream().map(value -> new AbstractMap.SimpleEntry<>(entry.getKey(), value)))
           .forEach(entry -> print(entry.getKey(), entry.getValue()));
    }
    
        4
  •  0
  •   Lino    7 年前

    我不明白你为什么要用流来做这样简单的事情。

    您仍然可以在实用程序类的某个地方创建一个助手方法:

    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));
    
    推荐文章