我有一个由 Google Places API 获取的 Google PlaceSummary 对象列表。我想通过它们的 Google Place ID 进行收集和分组,但同时保留元素的顺序。我认为可行的方法是:
Map<String, List<PlaceSummary>> placesGroupedByPlaceId =
places.stream()
.collect(Collectors.groupingBy(
PlaceSummary::getPlaceId,
LinkedHashMap::new,
Collectors.mapping(PlaceSummary::getPlaceId, toList())
));
但是它甚至无法编译。根据Java API文档中的Collectors,它看起来应该可以。
之前我有这段代码:
Map<String, List<PlaceSummary>> placesGroupedByPlaceId = places.stream()
.collect(Collectors.groupingBy(PlaceSummary::getPlaceId));
然而,Streams API上的标准.collect()
不会保留后续HashMap
中元素的顺序(显然因为HashMap
是无序的)。我希望输出结果是一个LinkedHashMap
,这样Map就按每个bucket插入的顺序排序。
然而,我建议的解决方案无法编译。首先,它无法识别PlaceSummary::getPlaceId
,因为它说它不是一个函数 - 即使我知道它是。其次,它说我不能将LinkedHashMap<Object,Object>
转换为M。 M应该是泛型集合,所以应该被接受。
如何使用Java Stream API将列表转换为LinkedHashMap
?是否有简洁的方法可以做到这一点?如果太难理解,我可能只能采用旧学校的Java 8之前的方法。
我注意到有另一个Stack Overflow回答关于将List转换为LinkedHashMap,但这没有我想要的解决方案,因为我需要收集“this”我正在迭代的对象。
Collectors.toList()
而不是toList()
。 - njzk2