拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 使用流「Streams」在列表中查找最大日期

使用流「Streams」在列表中查找最大日期

白鹭 - 2022-12-13 2171 0 2

一、概述

在本文中,我们将首先创建一个带有日期的对象。然后,我们将看到如何使用Streams在这些对象的列表中找到最大日期。

2. 示例设置

Java 的原始DateAPI 仍然被广泛使用,因此我们将展示一个使用它的示例。然而,从Java 8 开始,LocalDate被引入,大多数Date方法都被弃用了。因此,我们还将展示一个使用LocalDate的示例。

首先,让我们创建一个包含单独Date属性的基本Event对象:

public class Event {
 Date date;
 // constructor, getter and setter
 }

我们现在可以定义三个Event的列表:今天发生的第一个,明天发生的第二个,以及一周内的第三个。要将日期添加到Date,我们将使用Apache Commons 的DateUtils方法addDays()

Date TODAY = new Date();
 Event TODAYS_EVENT = new Event(TODAY);
 Date TOMORROW = DateUtils.addDays(TODAY, 1);
 Event TOMORROWS_EVENT = new Event(TOMORROW);
 Date NEXT_WEEK = DateUtils.addDays(TODAY, 7);
 Event NEXT_WEEK_EVENT = new Event(NEXT_WEEK);
 List<Event> events = List.of(TODAYS_EVENT, TOMORROWS_EVENT, NEXT_WEEK_EVENT);

我们现在的目标是编写一个能够确定NEXT_WEEK_EVENT是此Event列表中的最大日期的方法。我们也会对LocalDate而不是Date做同样的事情。我们的LocalEvent将如下所示:

public class LocalEvent {
 LocalDate date;
 // constructor, getter and setter
 }

由于LocalDate已经有一个内置的plusDays()方法,因此构建Event列表更简单一些:

LocalDate TODAY_LOCAL = LocalDate.now();
 LocalEvent TODAY_LOCAL_EVENT = new LocalEvent(TODAY_LOCAL);
 LocalDate TOMORROW_LOCAL = TODAY_LOCAL.plusDays(1);
 LocalEvent TOMORROW_LOCAL_EVENT = new LocalEvent(TOMORROW_LOCAL);
 LocalDate NEXT_WEEK_LOCAL = TODAY_LOCAL.plusWeeks(1);
 LocalEvent NEXT_WEEK_LOCAL_EVENT = new LocalEvent(NEXT_WEEK_LOCAL);
 List<LocalEvent> localEvents = List.of(TODAY_LOCAL_EVENT, TOMORROW_LOCAL_EVENT, NEXT_WEEK_LOCAL_EVENT);

3. 获取最大日期

首先,我们将使用Stream API流式传输我们的Event列表然后,我们需要将Dategetter 应用于Stream的每个元素。因此,我们将获得一个包含事件日期的Stream我们现在可以使用max()函数了。这将返回Stream中关于提供的Comparator的最大Date

Date类实现Comparable<Date>因此,compareTo()方法定义了自然日期顺序。简而言之,可以在max()中等效地调用以下两个方法:

  • DatecompareTo()可以通过方法引用来引用

  • ComparatornaturalOrder()可以直接使用

最后,需要注意的是,如果给定的Event列表为null 或为空,我们可以直接返回null。这将确保我们在流式传输列表时不会遇到问题。

该方法最终如下所示:

Date findMaxDateOf(List<Event> events) {
 if (events == null || events.isEmpty()) {
 return null;
 }
 return events.stream()
 .map(Event::getDate)
 .max(Date::compareTo)
 .get();
 }

或者,使用naturalOrder(),它会显示为:

Date findMaxDateOf(List<Event> events) {
 if (events == null || events.isEmpty()) {
 return null;
 }
 return events.stream()
 .map(Event::getDate)
 .max(Comparator.naturalOrder())
 .get();
 }

总而言之,我们现在可以快速测试我们的方法是否为我们的列表返回了正确的结果:

assertEquals(NEXT_WEEK, findMaxDateOf(List.of(TODAYS_EVENT, TOMORROWS_EVENT, NEXT_WEEK_EVENT);

使用LocalDate,推理完全相同。LocalDate确实实现了ChronoLocalDate接口,该接口扩展了Comparable<ChronoLocalDate>因此,LocalDate的自然顺序由ChronoLocalDatecompareTo()方法定义。

结果,方法可以写成:

LocalDate findMaxDateOf(List<LocalEvent> events) {
 if (events == null || events.isEmpty()) {
 return null;
 }
 return events.stream()
 .map(LocalEvent::getDate)
 .max(LocalDate::compareTo)
 .get();
 }

或者,以完全等效的方式:

LocalDate findMaxDateOf(List<LocalEvent> events) {
 if (events == null || events.isEmpty()) {
 return null;
 }
 return events.stream()
 .map(LocalEvent::getDate)
 .max(Comparator.naturalOrder())
 .get();
 }

我们可以编写以下测试来确认它是否有效:

assertEquals(NEXT_WEEK_LOCAL, findMaxDateOf(List.of(TODAY_LOCAL_EVENT, TOMORROW_LOCAL_EVENT, NEXT_WEEK_LOCAL_EVENT)));

4。结论

在本教程中,我们了解了如何在对象列表中获取最大日期。我们使用了DateLocalDate对象。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *