代码之家  ›  专栏  ›  技术社区  ›  Nicolas Sagala Beaucage

从复杂列表创建的集合

  •  3
  • Nicolas Sagala Beaucage  · 技术社区  · 7 年前

    因此,我有一个列表,其中包含来自数据库的重复实体,具有相同的“Id”(不是真实的Id,而是某种类型),但创建日期不同。

    示例I有一个已创建用户的列表:

    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());
    

    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());
    

    2 回复  |  直到 7 年前
        1
  •  4
  •   Eugene    7 年前

    试试这个:

    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 并将其收集到 List .

        2
  •  0
  •   algrid    7 年前

        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());