从复杂的List创建的集合

时间:2017-08-22 19:43:03

标签: java list set

所以我有一个包含来自数据库的重复实体的列表,其中包含相同的“Id”(它不是真正的Id但是有点类似),而是一个不同的CreatedDate。

所以我希望使用最新的CreatedDate重复最新的实体。

示例我有一个创建用户列表:

RealId|CreatedDate|Id|Name
1|20170101|1|User1
2|20170102|1|User1Modified
3|20170103|2|User2
4|20170104|2|User2Modified

从该列表中获得的最佳方式是:

RealId|CreatedDate|Id|Name
2|20170102|1|User1Modified
4|20170104|2|User2Modified

这是我的第一个想法

List<T> r = query.getResultList();

Set<T> distinct = r.stream().filter(x -> {
    List<T> clones = r.stream()
        .filter(y -> y.getId() == x.getId())
        .collect(Collectors.toList());

    T max = clones.stream()
        .max(Comparator.comparing(AbstractEntityHistory::getEntryDate))
        .get();

    return max.getNumber() == x.getNumber();
}).collect(Collectors.toSet());

我的另一个想法是按顺序降序,然后执行distinct()。collect(),如:

Set<T> distinct2 = r.stream().sorted((x,y) -> {
   if(x.getEntryDate().isBefore(y.getEntryDate())) {
        return 1;
    } else if(x.getEntryDate().isAfter(y.getEntryDate())) {
        return -1;
    } else {
        return 0;
    }
}).distinct().collect(Collectors.toSet());

这里,T覆盖等于观察RealId的等于否则使用反射来观察其他所有场。

2 个答案:

答案 0 :(得分:4)

试试这个:

<input type="text" placeholder="Email" name="email" id="email" required="required">

此处使用List<YourObject> collect = activities .stream() .collect(Collectors.groupingBy( YourObject::getId, Collectors.maxBy(Comparator.comparing(YourObject::getCreatedDate)))) .entrySet() .stream() .map(e -> e.getValue().get()) .collect(Collectors.toList()); 创建Collectors.groupingBy,按Map<Integer, Optional<YourObject>>和最近id分组。您获得此地图的createDate并将其收集到entrySet

答案 1 :(得分:0)

没有java8功能的东西:

    Map<Long, Item> map = new HashMap<>();
    for (Item item: items) {
        Item old = map.get(item.getId());
        if (old == null || old.getDate().before(item.getDate())) {
            map.put(item.getId(), item);
        }
    }

    List<Item> result = new ArrayList<Item>(map.values());