Я хочу написать код, который сможет использовать ряд условий для фильтрации списка объектов, но я хочу, чтобы количество условий колебалось (иногда фильтрация выполняется с 1 полем, а иногда со всеми 3 полями).
В моей ситуации я хочу, чтобы у пользователя была возможность выбора 'any' для определенного поля, но затем все еще применяю фильтр для других полей.В приведенной ниже ситуации пользователь может фильтровать список по полям x, y & z
, но затем он может также изменить один из фильтров на «любой», что делает этот фильтр ненужным при фактической фильтрации списка.Метод getFilteredList
берет значение String
из каждого поля со списком и использует каждый String
для фильтрации списка, если String
не равен 'any', тогда он будет принимать любые String
из этого поля.
Ниже я написал код, который будет работать для такой ситуации, но будет становиться все более неэффективным при добавлении большего количества фильтров в будущем.(2 фильтра приводят к 4 операторам возврата, 3 фильтра - к 8 и т. Д.).
private static ArrayList<Model> getFilteredList(ArrayList<Model> originalList, String x, String y, String z ){
if(x.equals("any") && y.equals("any") && z.equals("any")) {
return originalList;
}
if(x.equals("any") && y.equals("any") && !z.equals("any")) {
return originalList.stream().filter(item -> item.getZ().equals(z)).collect(Collectors.toCollection(ArrayList::new));
}
if(x.equals("any") && !y.equals("any") && z.equals("any")) {
return originalList.stream().filter(item -> item.getY().equals(y)).collect(Collectors.toCollection(ArrayList::new));
}
if(x.equals("any") && !y.equals("any") && !z.equals("any")) {
return originalList.stream().filter(item -> item.getY().equals(y)&& item.getZ().equals(z)).collect(Collectors.toCollection(ArrayList::new));
}
if(!x.equals("any") && y.equals("any") && z.equals("any")) {
return originalList.stream().filter(item -> item.getX().equals(x)).collect(Collectors.toCollection(ArrayList::new));
}
if(!x.equals("any") && y.equals("any") && !z.equals("any")) {
return originalList.stream().filter(item -> item.getX().equals(x)&& item.getZ().equals(z)).collect(Collectors.toCollection(ArrayList::new));
}
if(!x.equals("any") && !y.equals("any") && z.equals("any")) {
return originalList.stream().filter(item -> item.getX().equals(x)&& item.getY().equals(y)).collect(Collectors.toCollection(ArrayList::new));
}
if(!x.equals("any") && !y.equals("any") && !z.equals("any")) {
return originalList.stream().filter(item -> item.getX().equals(x)&& item.getY().equals(y)&& item.getZ().equals(z)).collect(Collectors.toCollection(ArrayList::new));
}
return originalList;
}
Вот как будет выглядеть Model
:
public class Model {
private String x;
private String y;
private String z;
public String getX() {
return x;
}
public String getY() {
return y;
}
public String getZ() {
return z;
}
}
Приведенный ниже код вернет список, где поля x
равны 'красным', где поля y
равны 'средним' и где поля z
могут быть любыми.
private static ArrayList<Model> items = new ArrayList<>();
public static void main(String[] args) {
ArrayList<Model> filteredList = getFilteredList(items, "red", "medium", "any");
}
* 1028Я не уверен, есть ли более простой способ сделать мой метод
getFilteredList
, я много искал, но не могу найти более простой / более эффективной реализации.В будущем я надеюсь разрешить использование более 10 фильтров, где вариант «любой» всегда является опцией, но мое текущее решение слишком длинное и не будет элегантным.Если бы кто-нибудь мог дать ответы на вопросы о том, как элегантно отфильтровать список с различным количеством фильтров, это было бы очень полезно.
Спасибо.