[英]How to filter list based on custom criteria?
我有一个由对象组成的 java 列表。 大多数对象都有公共字段,我只需要从具有特定字段集的候选列表中保留一个对象。 我怎样才能做到这一点? 例子
class A{
String field1;
String field2;
String field3;
LocalDate dateField;
}
具有以下值;
A first = new A("field1","field2","field3",null);
A second = new A("field1","field2","field3",LocalDate.now());
A third= new A("field1","field2","field3",LocalDate.now().plusMonths(3));
A forth= new A("4","5","6",LocalDate.now().plusMonths(3));
A fifth = new A("7","8","9",LocalDate.now().plusMonths(3));
我需要编写一个方法来返回一个由第二个、第四个和第五个组成的列表。 因此,如果 field1 field2 和 field3 相同,我需要保留最小 localdate 字段。 如何实现这一目标?
我知道你有一个A
类型的对象的List<A>
。
它似乎想过滤列表,查询符合某些要求的项目A
过滤该列表时您想搜索什么类型的东西不是很清楚。
List<A> items = ...; // setup the items
List<A> items_filtered = items.stream()
.filter( x -> x.field1.equals("value") )
.collect(Collectors.toList());
List<A> items_filtered_2 = items.stream()
.filter( x -> !x.field2.equals("other_value") )
.collect(Collectors.toList());
这些过滤器可以应用于任何列表,包括作为前一个过滤器结果的列表,或者您可以在同一个过滤器中组合两个检查。
List<A> fitlered_both = items.stream()
.filter( x -> x.field1.equals("value") && !x.field2.equals("other_value") )
.collect(Collectors.toList());
你可以试试这个
public static void main(String[] args) {
A first = new A("field1","field2","field3",null);
A second = new A("field1","field2","field3",LocalDate.now());
A third= new A("field1","field2","field3",LocalDate.now().plusMonths(3));
A forth= new A("4","5","6",LocalDate.now().plusMonths(3));
A fifth = new A("7","8","9",LocalDate.now().plusMonths(3));
List<A> collect = Stream.of(first, second, third, forth, fifth)
.collect(
Collectors.groupingBy(a -> Objects.hash(a.field1, a.field2, a.field3),
Collectors.minBy((o1, o2) -> {
if(o1 == null || o2 == null || o1.dateField == null || o2.dateField == null){
return 1;
}
return o1.dateField.compareTo(o2.dateField);
})))
.values().stream().map(Optional::get).collect(Collectors.toList());
System.out.println(collect);
}
您希望首先按相似对象对对象进行分组, Objects.hash(field1, field2, field3)
将根据field1
、 field2
和field3
对对象进行分组。
接下来,您要使用Localdate
对分组进行Localdate
。 接下来,我们收集每个组的第一个元素,这就是我们的答案。
我建议编写一个比较器并使用它对列表进行排序。 然后您将能够在一次通过中检索所有所需的对象
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.