例如:
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());
希望这能帮助