java - 避免条件的清洁方法

标签 java if-statement coding-style conditional-statements

我有这样的代码:

 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/

相关文章:

java - 以编程方式添加组件的样式与 XML 布局中的样式不同

用于分辨率检测的 JavaScript,但似乎返回错误

javascript - 将函数传递给 Backbone.View.extend

python - 使用 "if x in (y, z)"会比使用 "if x == y or x == z"更好吗?

powershell - Powershell(如果更改了Set-Content)

javascript - 服务器端 Javascript 最佳实践?

java - 关于 boolean 条件双括号的问题(可能是Java)?

java - 如何设置JVM存储MDMP文件的目录

java - Struts2 验证还是 HTML5 验证?

java - Spring OAuth2 "Full authentication is required to access this resource"