使用Guava集合将自定义对象列表转换/过滤到另一个对象

时间:2016-07-15 01:19:05

标签: java list dictionary collections guava

我正在尝试将此逻辑转换为可能使用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

1 个答案:

答案 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;