[英]Java Streams - How to preserve the initial Order of elements while using Collector groupingBy()
我正在尝试将对象列表转换为对象列表列表,即将List<T>
转换为List<List<T>>
并通过用作排序键的字符串列表对它们进行分组。
问题是在groupingBy()
之后,返回值是一个映射,并且映射不同的值顺序。
我可以做些什么来保留列表groupedTreesList
中元素的初始顺序?
我的代码:
Map<List<String>,List<QueryTreeProxy>> groupedMap = treesProxyList.stream()
.collect(Collectors.groupingBy(
QueryTreeProxy::getMappingKeys,
Collectors.toList()
));
List<List<QueryTreeProxy>> groupedTreesList = groupedMap.values().stream().toList();
groupingBy()
,返回值是一个映射,该映射输出不同顺序的值列表
您可以使用另一种groupingBy(classifier, mapFactory, downstream)
,它允许您指定 Map 的类型。 我们可以使用LinkedHashMap
来保存初始顺序。
并且不需要生成第二个流,您可以使用ArrayList
的参数化承包商来代替。
Map<List<String>, List<QueryTreeProxy>> groupedMap = treesProxyList.stream()
.collect(Collectors.groupingBy(
QueryTreeProxy::getMappingKeys,
LinkedHashMap::new,
Collectors.toList()
));
List<List<QueryTreeProxy>> groupedTreesList = new ArrayList<>(groupedMap.values());
除此之外,使用可变对象作为键并不是一个好习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.