【问题标题】:Java - filter list of objects by property combo and most recent dateJava - 按属性组合和最近日期过滤对象列表
【发布时间】:2019-03-23 08:11:28
【问题描述】:

我有一个包含属性名称、公司和日期的对象列表。我想过滤该列表以根据日期获取最新的名称+公司组合。示例数据:

id | name | company | date
----------------------
 1 | bob  |    A    | 01/2017
 2 | bob  |    A    | 01/2016
 3 | bob  |    A    | 01/2015
 4 | bob  |    B    | 03/2017
 5 | sal  |    B    | 04/2018
 6 | sue  |    A    | 01/2016
 7 | sue  |    A    | 01/2017
 8 | sue  |    A    | 01/2015

所需的结果应该是一个包含 id 的列表:1、4、5 和 7。

如果名称+公司组合不存在,我可以检查列表中的每个项目并将其添加到新列表中,如果存在,请检查日期以查看是否应该替换现有的。但我觉得应该有一种更简单的方法来通过流和过滤器来做到这一点。我只是想不出怎么做。搜索提供了 Collections.max 等方法,但我想要一个基于组合的最大值列表。

这些是 java 构造的对象,而不是持久化的实体,否则我会做这样的事情:GROUP BY with MAX(DATE)。但我想完成同样的事情。

是否可以使用过滤器来做到这一点,还是我唯一的选择是长途?

【问题讨论】:

  • 我建议你放弃 Stream 的想法,寻找更好的数据库检索方法。
  • 这些是 java 构造的对象,不是实体,否则我会。

标签: java list filter compare java-stream


【解决方案1】:

您想使用 Collectors API 中的 groupingBy 方法。它允许您提供一个函数,该函数根据您的流中的一个对象创建一个键,然后为您获取一个 Map>。你会得到如下代码:

Function<YourObject, String> keyGen = o -> o.getName() + o.getCompany();
Comparator<YourObject> comp = (f1, f2) -> f1.date().compareTo(f2.getDate()
yourObjects.stream().collect(Collectors.groupingBy(keyGen)).values().stream().map(list -> Collections.max(list, comp)).map(MyObject::getId).collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    我在这里遇到了同样的问题。这是我和一位数据库专家朋友一起得到的解决方案:

    SELECT 
        b1.name,b1.date, b1.balance, b1.user_id
    FROM table_name b1
        INNER JOIN (SELECT b.name,max(b.date) as maxdate,b.user_id
                    FROM table_name b
                   GROUP BY b.user_id,b.name, CAST(b.date as date)) as b2 ON b2.user_id = b1.user_id AND b2.name = b1.name AND b2.maxdate = b1.date
    where b1.user_id = '1'
    and b1.date >= '2021-11-01 00:00:00'
    AND b1.date <= '2021-11-30 23:59:59'
    order by b1.name, b1."date" asc ;
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多