我正在尝试根据值过滤掉一个列表。我有两个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);
}
}
}
}
答案 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);
}