Предположим, у меня есть класс Person
public class Person {
private final String name;
private final int age;
private boolean rejected;
private String rejectionComment;
public void reject(String comment) {
this.rejected = true;
this.rejectionComment = comment;
}
// constructor & getters are ommited
}
и мое приложение выглядит примерно так
class App {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("John", 10),
new Person("Sarah", 20),
new Person("Daniel", 30)
)
persons.forEach(p -> {
rejectIfYoungerThan15(p);
rejectIfNameStartsWithD(p);
// other rejection functions
}
}
private static void rejectIfYoungerThan15(Person p) {
if (!p.isRejected() && p.getAge() < 15) {
p.reject("Too young")
}
}
private static void rejectIfNameStartsWithD(Person p) {
if (!p.isRejected() && p.getName().startsWith("D")) {
p.reject("Name starts with 'D'")
}
}
// other rejection functions
}
Дело в том, что мне не нравится, что я должен выполнять !p.isRejected()
проверку каждой функции отклонения. Более того, нет смысла передавать уже отклоненного человека следующим фильтрам.
Поэтому моя идея состоит в том, чтобы использовать механизм Stream.filter
и сделать что-то вроде
persons.stream().filter(this::rejectIfYoungerThan15).filter(this::rejectIfNameStartsWithD)...
И изменить сигнатуру для этих методов, чтобы она возвращала true
, если переданный Person
не был отклонен, и false
в противном случае.
Но мне кажется, что очень плохо использовать filter
с не чистыми функциями.
У вас есть идеи, как сделать это более элегантно?