Java 8 如果过滤器列表为空,则忽略"filter"



例如:

public class Main {
public static void main(String[] args) {
List<Cat> cats = //Get cats somwhere;
List<String> favoriteNames = {"Bella", "Leo"};
cats.stream()
.filter(cat -> favoriteNames.stream().anyMatch(Cat::getName::equalsIgnoreCase))
.filter(/*Any other filter*/)
.collect(Collectors.toList());
}
}
public class Cat {
String name;
int age;
public String getName() {
return name;
}

public int getAge() {
return age;
}
}

我只想养favoriteNames的猫(如果它不是空的(,或者如果favoriteNames是空的,我想养所有的猫。然后我想做任何其他事情(例如,只选择老猫(。当前的例子(如果我没有在Predicate中打印错误(将过滤掉所有猫,如果没有任何喜欢的名字。如何使用流来完成我想要的操作?

试试这个。

public static void main(String[] args) {
List<Cat> cats = List.of(new Cat("たま", 3), new Cat("しろ", 2));
List<String> favoriteNames = List.of();
List<Cat> favoriteCats = cats.stream()
.filter(cat -> favoriteNames.isEmpty() || favoriteNames.contains(cat.getName()))
.toList();
System.out.println(favoriteCats);
}

输出:

[Cat(name=たま, age=3), Cat(name=しろ, age=2)]

var stream = cats.stream();
if (!favoriteNames.isEmpty())
stream = stream.filter(cat -> favoriteNames.contains(cat.getName()));
List<Cat> favoriteCats = stream.toList();
public List<Cat> filterCats(List<Cat> input, List<String> favouriteNames) {
return input.stream()
.filter(cat -> favouriteNames.size() == 0 || favouriteNames.contains(cat.getName()))
.filter(cat -> cat.getAge() > 5)
.collect(Collectors.toList());
}

其中,cat.getAge() > 5是附加滤波器的示例。

List<Cat> cats = //Get cats somwhere;
List<String> favoriteNames = {"Bella", "Leo"};
cats.stream()
.filter(cat -> {
if(favoriteNames.stream().anyMatch(Cat::getName::equalsIgnoreCase))){ 
return //any filter if true;}               
else {
return cat.getId()!=null;  //return back the whole list cuz id is always present}    
.filter(/*Any other filter*/)
.collect(Collectors.toList());

希望这能帮助

最新更新