Java - 根据多个值过滤列表

时间:2017-11-10 11:02:19

标签: java arraylist

我正在尝试根据值过滤掉一个列表。我有两个List。一个是我要删除的名称列表,即animalList中出现的名称。另一个是主要的主要列表AnimalPrimaryDataPojoFilterList,我必须从中删除与animalList中的名称匹配的对象。现在我确实有解决方案,但我认为这需要很多时间。下面是代码。我正在使用Java 8.它可以优化吗?

if(animalList!=null && animalList.size()>0)
        {
            for(AnimalFilterPojo dtoObject:animalList)
            {
                if(!dtoObject.getApproved())
                {
                    for(AnimalPrimaryDataPojo mainDtoObject: AnimalPrimaryDataPojoFilterList)
                    {
                        if(mainDtoObject.getAnimalName().equalsIgnoreCase(dtoObject.getValue()))
                        {   
                            AnimalPrimaryDataPojoFilterList.remove(mainDtoObject);
                        }
                    }
                }
            }

4 个答案:

答案 0 :(得分:2)

使用removeAll()方法。

AnimalPrimaryDataPojoFilterList.removeAll(animalList);

它将从animalList

中删除AnimalPrimaryDataPojoFilterList的对象

N.B:您需要在hashCode()

中实施equals()AnimalFilterPojo方法

答案 1 :(得分:1)

您可以使用Java 8流过滤列表。在下面的示例中,Parent是具有String类型的abc属性的对象。我们正在使用List<Parent> objs

过滤List<String> names
public class ListFilterDemo {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        List<Parent> objs = new ArrayList<>();

        List<Parent> filtersObjs = objs.parallelStream().filter((obj) -> names.contains(obj.getAbc())).collect(Collectors.toList());
    }
}

class Parent {
    private String abc;

    public Parent(String abc) {
        this.abc = abc;
    }

    public String getAbc() {
        return this.abc;
    }
}

答案 2 :(得分:1)

你可以试试这个:

if(animalList!=null && animalList.size()>0)
    animalList.removeIf(animal ->
        AnimalPrimaryDataPojoFilterList.stream()
           .filter(filter -> !filter.getApproved())
           .map(AnimalFilter::getValue)
           .collect(Collectors.toList()).contains(animal.getAnimalName()));

解释代码:这里我们在List上使用removeIf()来使用Predicate删除对象,animal是接收AnimalPrimaryDataPojoFilterList的lambda并通过删除元素来过滤列表通过名称从名单中获取名称,该列表是作为选择具有已批准标志的filter元素(第二个value)生成的,提取map(使用{{ 1}})并使用Collector构建一个列表。

部分:

AnimalPrimaryDataPojoFilterList.stream()
   .filter(filter -> !filter.getApproved())
   .map(AnimalFilter::getValue)
   .collect(Collectors.toList())

生成要用作过滤器的列表

animalList.removeIf(animal ->
    <generated list>.contains(animal.getAnimalName()));

使用生成的列表来应用过滤器。 请注意,这当然会修改您的列表 此外,你不应该像使用AnimalPrimaryDataPojoFilterList那样用大写字母开始一个变量。

答案 3 :(得分:0)

您可以使用removeIf然后使用AnimalPrimaryDataPojoFilterList作为来源,在这种情况下,您需要在if块内反转您的逻辑,例如:

if(animalList != null && animalList.size() > 0){
      AnimalPrimaryDataPojoFilterList.removeIf(x -> 
                    animalList.parallelStream()
                   .filter(e -> !e.getApproved() && x.getAnimalName().equalsIgnoreCase(e.getValue())).findAny().orElse(null) != null);
}