繁体   English   中英

如何根据自定义条件过滤列表?

[英]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)将根据field1field2field3对对象进行分组。

接下来,您要使用Localdate对分组进行Localdate 接下来,我们收集每个组的第一个元素,这就是我们的答案。

我建议编写一个比较器并使用它对列表进行排序。 然后您将能够在一次通过中检索所有所需的对象

暂无
暂无

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

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