【问题标题】:Java Stream: group by three fields and collect the last oneJava Stream:按三个字段分组并收集最后一个
【发布时间】:2018-04-10 14:50:03
【问题描述】:

我的对象类型是:

public class MyObjectDTO {
    Long id;
    String name;
    LocalDate date;
    String property;
}

我有一个包含此数据的对象的 ArrayList:

Element0: 1 name1 2018-01-01 property1
Element1: 1 name1 2018-01-01 property2
Element2: 2 name2 2015-05-05 property77
Element3: 2 name2 2015-05-05 property88
Element4: 2 name2 2015-05-05 null
Element5: 3 name3 2020-12-31 property99

我想要一个新的ArrayList<MyObjectDTO> 像这样分组:

Element0: 1 name1 2018-01-01 property1, property2
Element1: 2 name2 2015-05-05 property77, property88, null
Element2: 3 name3 2020-12-31 property99

所以,我想按 id、name 和 data 进行分组,我想将 String property 收集到一个 String 中。

可以用Java Stream吗?

非常感谢, 安德烈亚

【问题讨论】:

  • 简短的回答是“是”。也许您应该自己尝试一些事情,如果遇到特定问题,请更新您的帖子。
  • @ThomasTimbul 自己尝试过 :-) 但也许我不知道正确的流语法
  • 作为 SO 的一般指导,您应该包括您最近的编译尝试,它可以帮助人们回答并证明您至少付出了一些努力,而不仅仅是要求其他人完成您的工作。跨度>
  • @AndreaBevilacqua 您是否映射了 SQL 查询的结果?如果是,则可以将这种类型的分组作为查询的一部分进行。
  • @sn42,它们不仅可以,而且应该作为查询的一部分执行。

标签: java collections stream java-stream collectors


【解决方案1】:

您只需创建一个新方法来检查列表是否包含您要添加的对象(按 id 比较),如果包含则只需更新字符串,否则将新对象添加到列表中:

//add obj to list
public void add(MyObjectDTO  obj, ArrayList<MyObjectDTO> list){

    MyObjectDTO objectFromList = getObject(obj,list);

    //not contains
    if(objectFromList == null)
        list.add(obj);
    else //contains
        objectFromList.setProperty(objectFromList.getProperty + ", "+obj.getProperty());

}

public MyObjectDTO getObject(MyObjectDTO  instance,ArrayList<MyObjectDTO> list){
    for(MyObjectDTO obj:list)
        if(obj.equals(instance))
            return obj;

    return null;
}

你只需要重写 MyObjectDTO 类的 equals 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2019-10-08
    相关资源
    最近更新 更多