【问题标题】:Encapsulating Collection to Map transformation using Java 8's streams and collectors into a method使用 Java 8 的流和收集器将 Collection 到 Map 转换封装到方法中
【发布时间】:2018-02-02 08:21:09
【问题描述】:

我相信这个问题不是重复的,尽管有很多关于在 Java 8 中将列表转换为地图的问题。请多多包涵。

我正在尝试做的是逐步为自己构建一个函数库,以避免不得不一遍又一遍地重复涉及流和收集器的复杂编码,这往往过于冗长。

目前,我正忙于创建一种方法,该方法将集合转换为按集合对象的某些字段分组的地图。

假设我们有这个类:

   class SomeClass {
      private String someField;
      private String anotherfield;

      public String getSomeField() {
         return someField;
      }
      public String getAnotherField() {
         return anotherfield;
      }
   }

还有一个清单:

  List<SomeClass> myList = new ArrayList<SomeClass>();
  //populate the list...

我们想要这样,其中映射的每个键都是列表对象中 someField 的唯一值:

Map<String,List<SomeClass>> myMap;

可以这样做:

 Map<String,List<SomeClass>> myMap = 
    myList.stream().collect(Collectors.groupingBy(o -> o.getSomeField()  ));

这是我无法解决的部分。正如我所说,我想将其隐藏到我打算在我的项目中使用的实用程序类中的一个更清洁的方法中。方法的签名:

   public static <T, R> Map<R, List<T>> collectionToMap(
      Collection<T> coll, Function<? super T, ? extends R> groupByKey)

这会被称为:

Map<String,List<SomeClass>> amap = collectionToMap(myList, o -> o.getSomeField());

这是一个不能编译的笨拙尝试,只是为了给你一个想法:

   public static <T, R> Map<R, List<T>> collectionToMap(Collection<T> coll, Function<? super T, ? extends R> groupByKey) {
      Map<R,List<T>> amap = coll.stream().collect(Collectors.groupingBy( 
            T::groupBy,
            Collectors.mapping(T, Collectors.toList())
            ));
      return amap;
   }

我无法理解它。

【问题讨论】:

    标签: java collections java-8 java-stream collectors


    【解决方案1】:

    您不需要mapping。您只需将groupByKey Function 传递给groupingBy

    public static <T, R> Map<R, List<T>> collectionToMap(Collection<T> coll, Function<? super T, ? extends R> groupByKey) {
        return coll.stream().collect(Collectors.groupingBy(groupByKey));
    }
    

    【讨论】:

    • 啊,这么简单却想不到,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2017-07-03
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多