Skip to content
Advertisement

How to remove from list if list based on condition

I have a list of objects like this:

MyObject {

   Date date;
   int value;
}

I want to iterate the list and only keeps the objects where the dates differ. If there are two objects with the same date then I want to keep the object with the bigger value. Can this be achieved by using streams and predicates somehow?

Advertisement

Answer

You should use Map and Map.merge() instread of 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);
}

output:

MyObject[date=Thu Jan 01 09:00:00 JST 1970, value=1]
MyObject[date=Thu Jan 01 09:00:01 JST 1970, value=2]
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement