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&lt;T&gt; 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 -&gt; l.stream().sorted(Comparator.comparingInt(MyTemplate::getPosition)).collect(Collectors.toList())))).values(); 【参考方案1】:

您可以使用gropuingBycollectionAndThen 收集器:

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 -&gt; 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 的流

如何使用Java8流将列表列表转换为单个列表[重复]

使用 java 8 流转换 List<Map<String,String>> 与“,”分隔的字符串值

如何将map<string list<>>转换成城map<string,object>

如何将DataTable转换成List<T>