[英]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
您应该使用Map
和Map.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.