【问题标题】:Transform List to List<List> according the source List content根据源 List 内容将 List 转换为 List<List>
【发布时间】:2018-02-20 10:00:13
【问题描述】:

我有以下对象DataPoint

public class DataPoint {
   private String name:
   private int uploadIndex;
   ...
}

我有清单:

{uploadIndex:1, name:"name_1"}
{uploadIndex:5, name:"name_2"}
{uploadIndex:3, name:"name_3"}
{uploadIndex:3, name:"name_4"}
{uploadIndex:4, name:"name_5"}
{uploadIndex:5, name:"name_6"}
{uploadIndex:2, name:"name_7"}
{uploadIndex:4, name:"name_8"}

我想将其转换为按uploadIndex 排序的List&lt;List&lt;DataPoint&gt;&gt;
结果应该是(内部列表中的排序并不重要):

{
   {uploadIndex:1, name:"name_1"}
} 
{
   {uploadIndex:2, name:"name_7"}
} 
{
   {uploadIndex:3, name:"name_3"}
   {uploadIndex:3, name:"name_4"}
} 
{
   {uploadIndex:4, name:"name_5"}
   {uploadIndex:4, name:"name_8"}
} 
{    
   {uploadIndex:5, name:"name_2"}
   {uploadIndex:5, name:"name_6"}
} 

我写了以下代码:

List<DataPoint> dataPoints = getFromDb();
Map<Integer, List<DataPoint>> groupedDataPoints = dataPoints.stream()
                    .collect(Collectors.groupingBy(DataPoint::getUploadIndex, TreeMap::new, Collectors.toList()));
List<List<DataPoint>> groupedList = new ArrayList<>(groupedDataPoints.values());

1.此代码是否保证订购?
2、有没有更简洁的实现方式?

【问题讨论】:

  • 是的,但我猜无法保证将订购具有相同uploadIndex 的订单对象
  • @user7 在内部列表中排序对我来说并不重要

标签: java collections java-8 java-stream


【解决方案1】:
 dataPoints.stream()
           .collect(
                 Collectors.collectingAndThen(
                      Collectors.groupingBy(
                         DataPoint::getUploadIndex, 
                         TreeMap::new, 
                         Collectors.toList()
                      )
                 ),
                      map -> new ArrayList(map.values())
           );

你可以使用Collectors.collectingAndThen;除此之外,您的解决方案对我来说看起来不错。

【讨论】:

  • 对于具有相同uploadIndex的对象,这将按输入中的顺序收集对吗?换句话说,name上没有排序
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2020-11-27
  • 2021-09-17
  • 1970-01-01
  • 2018-02-20
相关资源
最近更新 更多