Инкапсуляция преобразования Коллекция в Карту с использованием потоков и сборщиков Java 8 в метод

Я считаю, что этот вопрос не является дубликатом, несмотря на многочисленные вопросы о преобразовании списков в карты в 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;
   }

Я не могу обернуть голову вокруг этого.

1 ответ

Решение

Вам не нужно mapping, Вы просто должны пройти groupByKeyFunction в 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));
}
Другие вопросы по тегам