当前位置: 首页 > 面试题库 >

使用Java 8 Stream API根据ID和日期过滤对象

常心水
2023-03-14
问题内容

我有一个Contact类,每个实例都有一个唯一的类contactId

public class Contact {
    private Long contactId;

    ... other variables, getters, setters, etc ...
}

还有一个Log类,它详细描述了action某人Contact在某个lastUpdated日期的表演。

public class Log {
    private Contact contact;
    private Date lastUpdated;
    private String action;

    ... other variables, getters, setters, etc ...
}

现在,在我的代码中,我List<Log>可以包含一个的多个Log实例Contact。我想根据对象中的变量对列表进行筛选,以Log使每个列表仅包含一个实例。结果列表应包含每个实例的最新实例。Contact``lastUpdated``Log``Log``Contact

我可以通过创建一个Map<Contact, List<Log>>,然后循环访问并为每个Log实例获取具有max
lastUpdated变量的实例Contact来做到这一点,但这似乎可以使用Java 8 Stream API简化得多。

使用Java 8 Stream API如何做到这一点?


问题答案:

您可以链接多个收集器以获得所需的内容:

import static java.util.stream.Collectors.*;

List<Log> list = ...
Map<Contact, Log> logs = list.stream()
    .collect(groupingBy(Log::getContact,
        collectingAndThen(maxBy(Comparator.comparing(Log::getLastUpdated)), Optional::get)));


 类似资料:
  • 问题内容: 我试图执行以下SQL查询并根据日期过滤出数据。 我需要显示一个表,该表过滤掉数据,使得仅那些提到的start_date和end_date之间的行 这是我一直在尝试的查询 我也从2012年获得了具有价值的结果。请帮帮我 谢谢 问题答案: 由于您没有提及任何错误(如果和是数据类型),因此查询没有任何问题。如果您没有获得正确的记录,请检查数据。 但是你的。您可以遵循一些好的做法来避免此类问题

  • 问题内容: 我正在使用Elasticsearch 6.6,尝试根据在日期范围内传递给查询(Bool)的多个值(email_address)提取多个结果/记录。例如:我想根据他们的email_address(annie@test.com,charles@test.com,heman@test.com)以及时期(即project_date(2019-01-01))提取有关少数雇员的信息。 我确实使用了

  • 问题内容: 我的服务器的CPU使用率异常高,我可以看到Apache使用了太多的内存。我有一种感觉,我被一个IP所包围-也许您可以帮助我找到他? 我使用以下行来查找10个最“活跃”的IP: 前5个IP对服务器的请求大约是“平均”用户的200倍。但是,我无法确定这5位访问者是否只是非常频繁的访问者,或者他们正在攻击服务器。 有没有办法将上述搜索指定到一个时间间隔,例如 最近两个小时还是今天的10到12

  • 问题内容: 我想知道您的想法: 在会话期间,我必须获得与系统的所有连接。为了使这一过程自动化,我决定使用current_date%,因为current_date不是字符串,而是一个函数,因此该方法不起作用。 所以我的问题是,是否有人可以帮助我进行查询以获取当日所有连接的数量。 提前致谢! 我糟糕的代码: 问题答案: 最好的方法(从性能的角度来看)是使用如下逻辑: 并非所有数据库都支持日期的ISO

  • 问题内容: 我有一个sql文件,其中包含以下数据,我将这些数据读入pandas中。 输出量 下一行代码是获取上周的日期 我所试图做的是,比较有并打印出所有行小于 显然,这会返回一个错误 我应该怎么做? 问题答案: 我会做一个面具,像: 如果为,则返回:

  • 问题内容: 我有包含单列和两列的数据行。我要做的是提取仅包含2列的行。 仅产生: 请注意,它们是制表符分隔的,即使对于只有一列的行,您也可以在其开头使用制表符。 怎么做呢? 我尝试了这个但是失败了: 问题答案: 您需要使用(字段数)变量来控制操作,例如以下记录: 如果字段数为2,将打印该行,否则将不执行任何操作。我之所以具有(看似)奇怪的构造,是因为如果没有任何规则匹配一行,则默认情况下将打印的某