我正在尝试将此逻辑转换为可能使用Guava集合并且无法确定哪一个最适合 - 过滤或转换。即使多步骤如何确保过滤发生的列表也会自行构建。
Map<Long, Detail> map = new HashMap<>();
for (Detail detail : detailList) {
if (map.containsKey(detail.getAppId())) {
Detail currentDetail = map.get(detail.getAppId());
if (detail.getCreatedOn().before(currentDetail.getCreatedOn())) {
continue;
}
}
map.put(detail.getAppId(), detail);
}
return new ArrayList<>(map.values());
其中Detail只是一个具有Long appId和Date creatednn的类。
甚至可以将此特定逻辑转换为基于番石榴的逻辑。
代码说明:从Detail对象列表中,找到每个appId最近创建的对象。如果appId有多个详细信息,则只选择最新的详细信息。
只能使用Java 7
答案 0 :(得分:3)
我认为你不能使用Guava中的过滤器或转换方法以某种方式重写此代码,但你当然可以从其他Guava方法中受益。
首先,使用Multimaps.index(Iterable<V> values, Function<? super V, K> keyFunction)
方法,您可以清楚地表明您希望通过appId将detailList分解为多个集合:
Multimap<Integer, Detail> detailsByAppId = Multimaps.index(detailList,
new Function<Detail, Integer>() {
@Override
public Integer apply(Detail detail) {
return detail.getAppId();
}
}
);
然后你可以遍历这个集合集合并找到每个集合的最新细节:
List<Detail> latestDetails = new ArrayList<Detail>();
for (Collection<Detail> detailsPerAppId : detailsByAppId.asMap().values()) {
Detail latestDetail = Collections.max(detailsPerAppId, new Comparator<Detail>() {
@Override
public int compare(Detail d1, Detail d2) {
return d1.getCreatedOn().compareTo(d2.getCreatedOn());
}
});
latestDetails.add(latestDetail);
}
return latestDetails;