一、概述
在本文中,我们将首先创建一个带有日期的对象。然后,我们将看到如何使用Streams
在这些对象的列表中找到最大日期。
2. 示例设置
Java 的原始Date
API 仍然被广泛使用,因此我们将展示一个使用它的示例。然而,从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
列表。然后,我们需要将Date
getter 应用于Stream
的每个元素。因此,我们将获得一个包含事件日期的Stream
。我们现在可以使用max()
函数了。这将返回Stream
中关于提供的Comparator
的最大Date
。
Date
类实现Comparable<Date>
。因此,compareTo()
方法定义了自然日期顺序。简而言之,可以在max()
中等效地调用以下两个方法:
Date
的compareTo()
可以通过方法引用来引用Comparator
的naturalOrder()
可以直接使用
最后,需要注意的是,如果给定的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
的自然顺序由ChronoLocalDate
的compareTo()
方法定义。
结果,方法可以写成:
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。结论
在本教程中,我们了解了如何在对象列表中获取最大日期。我们使用了Date
和LocalDate
对象。
0 评论