【问题标题】:Restructure List<MyType> to List<List<MyType>>将 List<MyType> 重组为 List<List<MyType>>
【发布时间】:2015-11-27 19:21:28
【问题描述】:

我有一个如下所示的 ArrayList:

final List<MyType> myList = new ArrayList<>();

MyType 看起来像这样:

public class MyType {
   ...
   private DateTime startTime;
   private DateTime endTime;
   private DateTime dateOfContainer; // I use @JSONSerializer here to only serialize date
   ....
}

JSON 看起来像这样:

[
 {
...
"endTime": "16:00",
"startTime": "13:00",
"dateOfContainer": "27.11.2015"
},
{
...
"endTime": "12:00",
"startTime": "08:00",
"dateOfContainer": "27.11.2015"
},
{
... 
"endTime": "16:00",
"startTime": "13:00",
"dateOfContainer": "25.11.2015"
}, 
{
...
"endTime": "19:00",
"startTime": "18:00",
"dateOfContainer": "21.11.2015"
},
...

现在我想要一个这样的列表:

List<List<MyType>>

具有相同 dateOfContainer 的 MyType 在一起,例如前两个。

Java-8 有没有一种简单的方法来做到这一点? 非常感谢!

【问题讨论】:

    标签: java arraylist java-8


    【解决方案1】:

    myList.stream().collect (Collectors.groupingBy(MyType::getDateOfContainer)) 会给你一个Map&lt;DateTime,List&lt;MyType&gt;&gt;,你的对象按日期属性分组。

    要从此Map 中获取List&lt;List&lt;MyType&gt;&gt;,您可以创建一个ArrayList 并使用该Map 的值对其进行初始化:

    List<List<MyType>> list = new ArrayList<> (
        myList.stream().collect (Collectors.groupingBy(MyType::getDateOfContainer)).values());
    

    请注意,为了使 groupingBy 能够按预期运行,DateTime 类必须覆盖 equals。我不确定这里是否是这种情况。

    【讨论】:

    • 非常感谢这种方法,效果很好,关于这个问题我还有一个问题。是否有可能获得 List有序列表,以便最新的 List 排在第一位。非常感谢!
    • @user3318489,请改用Collectors.groupingBy(MyType::getDateOfContainer, LinkedHashMap::new, Collectors.toList())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多