繁体   English   中英

如果基于条件列表,如何从列表中删除

[英]How to remove from list if list based on condition

我有一个像这样的对象列表:

MyObject {

   Date date;
   int value;
}

我想迭代列表,只保留日期不同的对象。 如果有两个对象具有相同的日期,那么我想保留具有较大值的对象。 这可以通过以某种方式使用流和谓词来实现吗?

是的,您可以使用stream来过滤不同的元素:

public class MyObject {
    
    private final LocalDate date;
    
    private final int value;
    
    public MyObject(LocalDate date, int value) {
        this.date = date;
        this.value = value;
    }
    
    public final LocalDate getDate() {
        return date;
    }
    
    public final int getValue() {
        return value;
    }
    
    @Override
    public String toString() {
        return "[date=" + date + ", value=" + value +"]";
    }
}

要获得不同的元素,您可以执行以下操作:

public static Collection<MyObject> getDistinct(List<MyObject> list) {
    return list.stream().collect(
            Collectors.groupingBy(MyObject::getDate, 
                    Collectors.collectingAndThen(
                            Collectors.maxBy(Comparator.comparingInt(MyObject::getValue)), 
                            Optional::get)))
            .values();
}

然后:

List<MyObject> list = List.of(new MyObject(LocalDate.of(2021, 1, 1), 1),
            new MyObject(LocalDate.of(2021, 1, 1), 2),
            new MyObject(LocalDate.of(2022, 2, 2), 2));
    
Collection<MyObject> distinct = getDistinct(list);
    
distinct.forEach(System.out::println);

输出:

[date=2022-02-02, value=2]
[date=2021-01-01, value=2]

注意:我会使用LocalDate而不是Date

您应该使用MapMap.merge()代替Stream

record MyObject(Date date, int value) {}

public static void main(String[] args) {
    List<MyObject> list = List.of(
        new MyObject(new Date(0), 0),
        new MyObject(new Date(0), 1),
        new MyObject(new Date(1000), 2));

    Map<Date, MyObject> map = new LinkedashMap<>();
    for (MyObject e : list)
        map.merge(e.date(), e, (a, b) -> a.value() > b.value() ? a : b);
    list = new ArrayList<>(map.values());

    for (MyObject e : list)
        System.out.println(e);
}

输出:

MyObject[date=Thu Jan 01 09:00:00 JST 1970, value=1]
MyObject[date=Thu Jan 01 09:00:01 JST 1970, value=2]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM