我有一个arraylist,它包含一个由多个ID组成的对象,并且它归因于时间戳。在arraylist中有多个具有不同时间戳的id。我想获得每个id的最大时间戳。我怎么能这样做?
我创建了以下用于排序的函数:
public Map<Integer,Date> getMaximumDateForId(Session session) throws ParseException {
Map<Integer,Date> mapIdDate = new HashMap<Integer,Date>();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
List<CSVServiceBaseFormat> listOfRemovedEntitlements = getListOfServiceProviderId(session);
for(CSVServiceBaseFormat record : listOfRemovedEntitlements){
if(!mapIdDate.containsKey(record.getBbd_id())){
mapIdDate.put(Integer.parseInt(record.getBbd_id()),formatter.parse(record.getActivity_date()));
}else{
if((mapIdDate.get(formatter.parse(record.getActivity_date()))).before(formatter.parse(record.getActivity_date()))){
mapIdDate.put(Integer.parseInt(record.getBbd_id()),formatter.parse(record.getActivity_date()));
}
}
}
return mapIdDate;
}
答案 0 :(得分:1)
对于示例,我假设以下类。
public class Activity {
int id;
LocalDate date;
// constructor, getters, toString method
}
获取每个ID的最新日期:
List<Activity> elements = // …
Map<Integer, LocalDate> latestDates = elements.stream()
.collect(Collectors.groupingBy(Activity::getId,
Collectors.mapping(Activity::getDate,
Collectors.collectingAndThen(Collectors.maxBy(LocalDate::compareTo),
Optional::get))));
我使用以下列表尝试了代码:
4 2018-03-07
3 2018-03-14
4 2018-02-11
3 2018-02-18
1 2018-01-24
2 2018-01-02
5 2018-03-13
4 2017-10-01
5 2018-01-09
3 2017-10-11
生成的地图打印为:
{1 = 2018-01-24,2 = 2018-01-02,3 = 2018-03-14,4 = 2018-03-07,5 = 2018-03-13}
如果您发现流代码太难以遵循,请改用循环。
编辑:我之前的流表达式是:
Map<Integer, LocalDate> latestDates = elements.stream()
.collect(Collectors.groupingBy(Activity::getId,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Activity::getDate)),
optAct -> optAct.get().getDate())));
即使旧版本的行更短,我认为新版本更自然,因为它在查找最新日期之前将“活动对象”映射到日期(而不是相反)。如果您需要活动(不仅仅是日期),旧表达式将是一个更好的起点。