这是我的课程,我的listOfmeeting
有标题和开始时间我必须将所有与日历日期保持一致的关键字和值List<MeetingModel>
,例如假设今天的日历实例为{{1}这将是关键和两个会议列表,其价值与其他相同。我将如何实现这一目标?
Calendar.getInstance()
答案 0 :(得分:0)
final ZoneId zone = ZoneId.of("Asia/Bangkok");
Map<LocalDate, List<MeetingModel>> mapEvents = listOfMeeting.stream()
.collect(Collectors.groupingBy(mm -> mm.getDate(zone)));
mapEvents.entrySet()
.forEach(e -> System.out.println("" + e.getKey() + " -> " + e.getValue()));
在我的电脑上打印出来:
2018-01-23 -> [2018-01-22T23:30:00Z 23rd meeting]
2018-01-22 -> [2018-01-21T22:30:00Z 21th second meeting]
2017-12-06 -> [2017-12-06T05:30:00Z Decemer 6 meeting]
2018-01-21 -> [2018-01-21T01:30:00Z 21th meeting]
2018-01-20 -> [2018-01-19T21:30:00Z 20th first meeting, 2018-01-19T23:30:00Z 20 the second meeing]
2018-01-19 -> [2018-01-18T23:30:00Z 19th meeting]
2018-01-18 -> [2018-01-18T00:30:00Z 18thmeeting]
日期没有按任何特定顺序排列,但您可以根据需要对地图条目进行排序,甚至可以使用SortedMap
,通常为TreeMap
。
为了让上面的代码片段起作用,我使用了一个方便的方法MeetingModel
:
public LocalDate getDate(ZoneId zone) {
return Instant.ofEpochMilli(startTime)
.atZone(zone)
.toLocalDate();
}
LocalDate
是java.time
中的一个类,是现代Java日期和时间API。我使用它至少有两个原因:(1)与过时的Calendar
类相比,现代API更适合使用它。 (2)LocalDate
是一个没有时间的日期,正是我们在你的情况下所需要的,所以它大大简化了你的任务。我被告知,在较新的Android设备java.time
内置。在较旧的设备上,您可以通过ThreeTenABP使用它,请参阅底部的链接。
从输出中可以看出,我没有正确猜出您想要的时区,因为21th second meeting
已经从1月22日开始映射。我相信您可以替换所需的时区而不是亚洲/曼谷,从而解决了这个问题。
我还在toString
添加了MeetingModel
方法。我的toString
方法以UTC格式打印时间,再次,您可以做得更好。
顺便说一句,使用适当的构造函数使您的类适合,使列表的初始化更简单,更易读:
ArrayList<MeetingModel> listOfMeeting = new ArrayList<>(List.of(
new MeetingModel(1512538200000L, "Decemer 6 meeting"),
new MeetingModel(1516235400000L, "18thmeeting"),
new MeetingModel(1516318200000L, "19th meeting"),
new MeetingModel(1516397400000L, "20th first meeting"),
new MeetingModel(1516404600000L, "20 the second meeing"),
new MeetingModel(1516498200000L, "21th meeting"),
new MeetingModel(1516573800000L, "21th second meeting"),
new MeetingModel(1516663800000L, "23rd meeting")));
在上面我使用的是Java 9中引入的新List.of
方法。在早期的Java版本中,只需使用旧的Arrays.asList
代替:
ArrayList<MeetingModel> listOfMeeting = new ArrayList<>(Arrays.asList(
但有一点不同:Arrays.asList
会接受null
会议,List.of
则不会。
java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。