У меня есть простой Book
класс, который содержит такие поля, как
private String ISBN;
private String title;
private String author;
. Я хочу создать поисковый запрос, который будет принимать BookDto
в качестве критерия, и сравнивать все необнуляемые поля с элементамимой List<Book>
.Поэтому я написал несколько простых Predicates
private Predicate<Book> matchingAuthor(Book another) {
return book -> book.getAuthor() != null && book.getAuthor().equals(another.getAuthor());
}
private Predicate<Book> matchingTitle(Book another) {
return book -> book.getTitle() != null && book.getTitle().equals(another.getTitle());
}
private Predicate<Book> matchingISBN(Book another) {
return book -> book.getISBN() != null && book.getISBN().equals(another.getISBN());
}
И я хотел бы иметь 1 метод поиска, который будет обрабатывать всю логику
private List<BookDto> findMatchingBooks(BookDto criteria) {
return books.stream().map(BookConverter::toEntity).filter(this::matchingBook).map(BookConverter::toDto).collect(Collectors.toList());
}
Но эта логика безобразна ...и это не будет работать так, как я хочу.
private Predicate<Book> matchingBook(Book criteria) {
if(criteria.getISBN() != null) {
return matchingISBN(criteria);
}
else if(criteria.getISBN() == null && criteria.getTitle() == null && criteria.getAuthor() != null) {
return matchingAuthor(criteria);
}
else if(criteria.getISBN() == null && criteria.getTitle() != null && criteria.getAuthor() != null) {
return matchingAuthor(criteria) && matchingTitle(criteria);
}
}
Первые два if/else
- допустим, нормально (некрасиво, но работает), третий вызывает
неверные типы операндов для двоичного оператора '&&' первый тип: предикатвторой тип: предикат
И вопрос в том, как этого добиться?