У меня есть список объектов Google PlaceSummary, взятых из API Google Адресов. Я хотел бы собрать и сгруппировать их по их идентификатору Google Place, но также сохранить порядок элементов. То, что я думал, будет работать:
Map<String, List<PlaceSummary>> placesGroupedByPlaceId =
places.stream()
.collect(Collectors.groupingBy(
PlaceSummary::getPlaceId,
LinkedHashMap::new,
Collectors.mapping(PlaceSummary::getPlaceId, toList())
));
Но он даже не будет компилироваться. Похоже, что в соответствии с документация Java API на коллекторах.
Раньше у меня был этот код:
Map<String, List<PlaceSummary>> placesGroupedByPlaceId = places.stream()
.collect(Collectors.groupingBy(PlaceSummary::getPlaceId));
Однако стандарт .collect()
в API потоков не сохраняет порядок элементов в последующем HashMap
(очевидно, поскольку HashMap
неупорядочен). Я хочу, чтобы результат был LinkedHashMap
, так что карта сортируется по порядку вставки каждого ведра.
Однако решение, которое я предложил, не компилируется. Во-первых, он не распознает PlaceSummary::getPlaceId
, поскольку он говорит, что это не функция, хотя я знаю, что это так. Во-вторых, он говорит, что я не могу преобразовать LinkedHashMap<Object, Object>
в M. M, как предполагается, является общей коллекцией, поэтому ее следует принять.
Как преобразовать List в LinkedHashMap
с помощью Java Stream API? Есть ли лаконичный способ сделать это? Если это слишком сложно понять, я могу просто прибегнуть к старым школьным пред-Java 8 методам.
Я заметил, что есть другой ответ при конвертировании списка в LinkedHashMap, но это не имеет решение, которое требуется, поскольку мне нужно собрать 'this' объект, который я специально перебираю.