如何转换列表<V>进入地图<K,名单<V >>,与Java 8流和自定义列表和地图供应商?

MarcG:

这很容易转化List<V>Map<K, List<V>>例如:

public Map<Integer, List<String>> getMap(List<String> strings) {
   return
      strings.stream()
             .collect(Collectors.groupingBy(String::length));
}

但我想用我自己做ListMap 供应商

我想出了这一点:

public Map<Integer, List<String>> getMap(List<String> strings) {
   return strings.stream()
       .collect(Collectors.toMap(
             String::length,
             item -> {List<String> list = new ArrayList<>(); list.add(item); return list;},
             (list1, list2) -> {list1.addAll(list2); return list1;},
             HashMap::new));
}

问:是否有更简单,更简洁,更高效的做这件事的呢?例如,这样的事情(不工作):

return strings.stream()
      .collect(Collectors.toMap(
            String::length,
            ArrayList::new,                    
            HashMap::new));

而如果我只需要定义的List供应商,而不是Map供应商?

Tunaki:

你可以有以下几点:

public Map<Integer, List<String>> getMap(List<String> strings) {
    return strings.stream().collect(
      Collectors.groupingBy(String::length, HashMap::new, Collectors.toCollection(ArrayList::new))
    );
}

集电极groupingBy(classifier, mapFactory, downstream)可以被用来指定哪些地图的类型是想要的,通过使其为在对需要的地图的一个供应商mapFactory然后,下游收集器,其用于收集分组为相同的要素,是toCollection(collectionFactory),这使得能够收集到从给定的供应商处获得的集合。

这可以确保返回的地图是HashMap和列表,可在每个值,是ArrayList请注意,如果你想返回地图和收集的具体实现,那么你很可能希望该方法返回的特定类型为好,这样就可以使用它们的属性。

如果你只需要指定一个集合的供应商,并保持groupingBy默认的地图,你可以省略上面的代码的供应商,并使用两个参数过载

public Map<Integer, List<String>> getMap(List<String> strings) {
    return strings.stream().collect(
      Collectors.groupingBy(String::length, Collectors.toCollection(ArrayList::new))
    );
}

作为一个侧面说明,你可以有一个通用的方法:

public <K, V, C extends Collection<V>, M extends Map<K, C>> M getMap(List<V> list,
        Function<? super V, ? extends K> classifier, Supplier<M> mapSupplier, Supplier<C> collectionSupplier) {
    return list.stream().collect(
        Collectors.groupingBy(classifier, mapSupplier, Collectors.toCollection(collectionSupplier))
    );
}

这一声明的好处是,你现在可以使用它具有特定HashMapArrayListS作为结果,或LinkedHashMapLinkedListsS,如果主叫方希望它:

HashMap<Integer, ArrayList<String>> m = getMap(Arrays.asList("foo", "bar", "toto"),
        String::length, HashMap::new, ArrayList::new);
LinkedHashMap<Integer, LinkedList<String>> m2 = getMap(Arrays.asList("foo", "bar", "toto"),
        String::length, LinkedHashMap::new, LinkedList::new);

但是,在这一点上,它可以更简单直接使用groupingBy的代码...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java的8转换地图<K,名单<V >>地图<V,名单<K >>

地图<K,V>返回地图<V,地图<K,V >> groupingBy值之后,而不是地图<的OBJ,列表<条目<K,V >>>

Java 8 Lambdas组列表进入地图

转换列表对象为使用Java 8个流对象的自定义地图

如何将列表转换为Map <K,V>但不能转换为List <V>

从List <Map <K,V >>到List <V>的转换(从地图列表中获取所有唯一值)

提取地图<K,多集<V >>从流的流在Java中8

Java流:地图<枚举,名单<A >>到列表<B>

在Java 8中,如何使用lambda将Map <K,V>转换为另一个Map <K,V>?

如何在Java 8中使用流将HashMap转换为K / V-String

进入深层嵌套的地图和列表

反转地图与列表值地图<钥匙,名单<值>>地图<值,重点>在Java中8

如何在Java中将List <Map <K,V >>转换为Map <K,List <V >>

将Java 8 List <V>转换为具有功能的Map <K,V>

将元素列表转换为Map <K,List <V >>

如何使用Java 8流和Lambda迭代和处理其值是元素列表的地图的值

Java HashObjObjMap <K,V>与HashMap <K,V>

Java 8 List <V>到Map <K,V>

如何列表,地图和“打印如果计数> 0”与Java 8 /流API?

Java的8名单<地图<字符串,对象>>到列表<地图<字符串,对象>>的键组和值数

列表到地图的转换(Java)

Range-v3:如何使用 actions::insert 和地图

类Association <K,V>的列表列表

如何名单<人>转换地图<字符串,列表<双>>,而不是地图<字符串,列表<人>>?

如何将一个POJO的列表转换地图<字符串,列表>在Java流?

如何使用带有空和空管检查平面地图在Java 8合并多个名单?

Java:如何将列表转换为地图

如何从字典列表中删除k,v项

Java的地图 - 如何获取自定义对象的列表作为一个单独的列表