我正在使用Spring Boot应用程序,并尝试基于Schedule POJO类的timeStart最早获取tag

我有一个带有getter和setter方法的简单bean-

Schedule.java

public class Schedule {
  private String id;
  private String tag;
  private String timeStart;
}


当我对此类列表进行for循环时,如下所示:-

List<Schedule> schedules = someAPI();
for (Schedule schedule : schedules) {
   LOGGER.info("schedule : "+schedule );
}


然后我得到以下输出:

schedule: [ID = 561, Tag = A1, timeStart = 2019-07-26 15:33:00]
schedule: [ID = 562, Tag = A1, timeStart = 2019-07-24 11:33:00]
schedule: [ID = 563, Tag = A1, timeStart = 2019-07-25 12:33:00]
schedule: [ID = 564, Tag = A2, timeStart = 2019-07-26 14:33:00]
schedule: [ID = 565, Tag = A2, timeStart = 2019-07-26 15:33:00]


现在,我想通过timeStart得到最小的tag name并存储在DB中,所以我需要类似以下的输出;-

A1 -> 2019-07-24 11:33:00
A2 -> 2019-07-26 14:33:00


我尝试了以下操作(将timeStarts按标签名称放置在哈希图中)-

Map < String, ArrayList < String >> timeStartsByTag = new HashMap < String, ArrayList < String >> ();
ArrayList < String > timeStarts = new ArrayList < String > ();
for (Schedule schedule: schedules) {
    if (timeStarts.isEmpty()) {
        timeStarts.add(schedule.getTimeStart());
    }
    if (!timeStarts.isEmpty() && timeStartsByTag.containsKey(schedule.getTag())) {
        timeStarts.add(schedule.getTimeStart());
    }
    timeStartsByTag.put(schedule.getTag(), timeStarts);
}


它不起作用。

最佳答案

在当前代码中,请勿比较timeStart值。所以它行不通。

此外,所有可能通过Collectors.toMap()重载而简化的功能都需要合并功能:

List<Schedule> schedules = someAPI();
Map<String, String> map =
schedules.stream()
         .collect(toMap(Schedule::getTag, Schedule::getTimeStart,
                        (t1,t2)-> t1.compareTo(t2) < 0 ? t1 : t2))
                );


String.compareTo()之所以起作用,是因为字典顺序符合您当前的要求,但这很脆弱。使用LocalDateTimeInstant表示2019-07-24 11:33:00更有意义。

关于java - 根据bean属性值获取最早的时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57674688/

10-13 07:41