Java 流:将 List<T> 转换为 List<List<T>>
Posted
技术标签:
【中文标题】Java 流:将 List<T> 转换为 List<List<T>>【英文标题】:Java stream : turn List<T> into List<List<T>> 【发布时间】:2021-11-26 22:00:39 【问题描述】:让我有一个类 T
具有三个属性:value, position, order
: (value,position,order)
我有List<T> input = [(1,1,1), (1,2,2), (1,3,1), (3,2,3), (5,1,2), (3,2,1)]
基本上,考虑到它们的order
(最后一个属性),我想将元素与上一个列表分开,并按position
对嵌套列表中的每个元素进行排序。
所以是这样的:
List<List<T>> output = [
[(1,1,1), (3,2,1) (1,3,1)],
[(5,1,2), (1,2,2)],
[(3,2,3)]
]
可以使用 Stream API 吗?
【问题讨论】:
这是什么(1,1,1)
对象?
"(1,1,1)" 等同于"new T(1,1,1)"
第一组按order然后按position排序list.stream().collect(Collectors.groupingBy(MyTemplate::getOrder,LinkedHashMap::new,Collectors.collectingAndThen(Collectors.toList(), l -> l.stream().sorted(Comparator.comparingInt(MyTemplate::getPosition)).collect(Collectors.toList())))).values();
【参考方案1】:
您可以使用gropuingBy
和collectionAndThen
收集器:
list.stream().collect(Collectors.groupingBy(
MyTemplate::getOrder,
Collectors.collectingAndThen(
Collectors.toList(),
l ->
l.sort(Comparator.comparingInt(MyTemplate::getPosition));
return l;
)
)).values();
【讨论】:
无需从列表中创建底层流,然后排序然后收集到新列表,最好只对列表本身进行排序:Collectors.collectingAndThen(Collectors.toList(), l -> l.sort(Comparator.comparingInt(MyTemplate::getPosition)); return l;)
@dajavax,你是对的。谢谢你的好点。以上是关于Java 流:将 List<T> 转换为 List<List<T>>的主要内容,如果未能解决你的问题,请参考以下文章
Java 8流 - 考虑到NULL,将UUID列表转换为String列表。
将 java-List<T> 转换为可用于 iomicrometer 的 MultiGauge 的流
使用 java 8 流转换 List<Map<String,String>> 与“,”分隔的字符串值