Инкапсуляция преобразования Коллекция в Карту с использованием потоков и сборщиков 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
, Вы просто должны пройти 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));
}