首页 > 解决方案 > 如何从具有最大日期时间对象的列表中获取对象

问题描述

下面是我查找具有最新开始日期时间的联系人对象的代码。DateTime 显示为一个对象。

有什么方法可以使用流和比较器来简化此代码。

public ContactData getLatestContact(ContactData[] contacts) {
  int latestContact = 0;
  for (int i = 1; i < contacts.length; i++) {
    if (DateTimeToolkit.compare(contacts[i].begin, contacts[latestContact].begin) > 0) {
      latestContact = i;
    }
  }
  return contacts[latestContact];
}

标签: javaarraysdatetimemax

解决方案


这应该像这样完成(假设ContactData有一个 getterbegin字段):

public ContactData getLatestContact(ContactData ... contacts) {
    return Arrays.stream(contacts)
                 .max(Comparator.comparing(ContactData::getBegin))
                 .orElse(null);
}

更新
如果字段没有 getter begin,则方法引用应替换为 lambdad -> d.begin

public ContactData getLatestContact(ContactData ... contacts) {
    return Arrays.stream(contacts)
                 .max(Comparator.comparing(d -> d.begin))
                 .orElse(null);
}

如果非常需要仅DateTimeToolkit::compare用于比较日期时间字段,则可以使用另一个 lambda 来完成(d1, d2) -> DateTimeToolkit.compare(d1.begin, d2.begin)

public ContactData getLatestContact(ContactData ... contacts) {
    return Arrays.stream(contacts)
                 .max((d1, d2) -> DateTimeToolkit.compare(d1.begin, d2.begin))
                 .orElse(null);
}

测试:

System.out.println(getLatestContact(
    new ContactData("Jack", LocalDateTime.now().minusDays(7)),
    new ContactData("Jeff", LocalDateTime.now().minusDays(3)),
    new ContactData("John", LocalDateTime.now().minusDays(1))
));

输出:

ContactData(name=John, begin=2021-02-18T11:52:51.014013200)

推荐阅读