我有这样的代码:
Map<String, String> args = new HashMap<>();
args.put("-T", "Tom Sawyer");
// args.put("-I", "1112223334");
if (args.containsKey("-T")) {
Book book = libraryService.findBookByTitle(args.get("-T"));
} else {
Book book = libraryService.findBookByIsbn(args.get("-I"));
}
图书馆服务:
public class LibraryService {
private final BookRepository bookRepository = new BookRepository();
public Book findBookByTitle(String title) {
return bookRepository.findByTitle(title);
}
public Book findBookByIsbn(String isbn) {
return bookRepository.findByIsbn(isbn);
}
图书资料库:
public class BookRepository {
private List<Book> books = new ArrayList<>();
public Book findByIsbn(String isbn) {
return books.stream()
.filter(s -> s.getIsbn().equals(isbn))
.findFirst()
.orElseThrow(() -> new RuntimeException(NO_BOOKS_FOUND));
}
public Book findByTitle(String title) {
return books.stream()
.filter(s -> s.getTitle().equals(title))
.findFirst()
.orElseThrow(() -> new RuntimeException(NO_BOOKS_FOUND));
}
是否有一种干净的方法来避免 ifs?我希望我的代码决定是否必须使用参数 -I
或 -T
。我处理了 args
没有任何参数的情况,我只是简化了 StackOverflow 的代码。我在我的代码中多次使用方法 findByTitle 和 findByIsbn,所以我不确定其他方法是否适合这里。
最佳答案
不是将参数传递给存储库,而是将一个完整的 Predicate
传递给它:
public class findOneByPredicate(Predicate<Book> filter) {
return books.stream()
.filter(filter)
.findFirst()
.orElseThrow(() -> new RuntimeException(NO_BOOKS_FOUND));
}
然后你可以这样调用它:
findOneByPredicte(b -> b.getIsbn().equals("ISBN"));
关于java - 避免条件的清洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50432617/