Java多条件书籍搜索方法简化及按分类/作者排序实现咨询
嘿,我来帮你梳理下怎么简化这个书籍搜索方法,还有实现按分类/作者排序的思路~
一、简化书籍搜索方法
你的原方法靠可变参数的顺序来区分标题、作者,这种方式有个大问题:以后要是想加书籍分类、出版年份这类新的搜索条件,就得不断修改参数长度的判断逻辑,很容易搞混出错。给你推荐两种更优雅、扩展性更强的简化方案:
方案1:用「参数对象」打包搜索条件
把所有可能用到的搜索字段(标题、作者、分类等等)封装成一个单独的BookSearchCriteria类,这样搜索方法的参数一目了然,后续加新条件只需要给这个类加字段就行,完全不用改方法签名。
先给你补个基础的Book实体类(假设你还没定义的话):
class Book { private String title; private String author; private String category; // 构造器 public Book(String title, String author, String category) { this.title = title; this.author = author; this.category = category; } // getter方法,用来获取字段值 public String getTitle() { return title; } public String getAuthor() { return author; } public String getCategory() { return category; } // 方便打印查看结果 @Override public String toString() { return "《" + title + "》 - " + author + " [" + category + "]"; } }
然后定义搜索条件类:
class BookSearchCriteria { private String title; private String author; private String category; // 可以写全参构造器,或者用Builder模式(更灵活,支持只传部分参数) public BookSearchCriteria(String title, String author, String category) { this.title = title; this.author = author; this.category = category; } // getter方法 public String getTitle() { return title; } public String getAuthor() { return author; } public String getCategory() { return category; } }
最后是简化后的搜索方法:
static List<Book> bookSearch(List<Book> books, BookSearchCriteria criteria) { List<Book> result = new ArrayList<>(); for (Book book : books) { boolean isMatch = true; // 只判断非空的条件——如果某个条件传了空,就跳过这个筛选 if (criteria.getTitle() != null && !criteria.getTitle().isEmpty()) { isMatch = isMatch && book.getTitle().contains(criteria.getTitle()); } if (criteria.getAuthor() != null && !criteria.getAuthor().isEmpty()) { isMatch = isMatch && book.getAuthor().contains(criteria.getAuthor()); } if (criteria.getCategory() != null && !criteria.getCategory().isEmpty()) { isMatch = isMatch && book.getCategory().contains(criteria.getCategory()); } if (isMatch) { result.add(book); } } return result; }
调用的时候特别清晰,比如我只想搜作者是“张三”的书:
// 只传作者条件,其他传null BookSearchCriteria criteria = new BookSearchCriteria(null, "张三", null); List<Book> foundBooks = bookSearch(bookList, criteria);
方案2:用Predicate动态组合条件(Java 8+)
如果你的项目用Java 8及以上,用Predicate可以玩出更灵活的花样——不用改搜索方法,就能动态组合N个搜索条件,比如同时搜标题+作者+分类:
static List<Book> bookSearch(List<Book> books, Predicate<Book>... filters) { // 把所有传入的条件组合成一个总的筛选规则 Predicate<Book> combinedFilter = Arrays.stream(filters) .reduce(Predicate::and) .orElse(b -> true); // 没传条件就返回所有书 // 用Stream流筛选,代码更简洁 return books.stream() .filter(combinedFilter) .collect(Collectors.toList()); }
调用的时候直接写条件就行,比如找标题含“Java”且作者是“李四”的书:
List<Book> foundBooks = bookSearch(bookList, book -> book.getTitle().contains("Java"), book -> book.getAuthor().equals("李四") );
这种方式完全不用改方法,以后加新条件只需要多传一个Predicate就行,超级灵活~
二、按分类/作者排序书籍
排序的话,Java的List自带的sort()方法就能搞定,结合Comparator可以轻松实现各种排序逻辑:
1. 按书籍分类排序
// 按分类名称升序排序(A-Z) bookList.sort(Comparator.comparing(Book::getCategory)); // 按分类名称降序排序(Z-A) bookList.sort(Comparator.comparing(Book::getCategory).reversed());
2. 按作者排序
// 按作者姓名升序排序 bookList.sort(Comparator.comparing(Book::getAuthor)); // 按作者姓名降序排序 bookList.sort(Comparator.comparing(Book::getAuthor).reversed());
3. 多条件链式排序(比如先分类后作者)
如果需要更精细的排序,比如先按分类分组,同一分类下再按作者姓名排序:
bookList.sort(Comparator.comparing(Book::getCategory) .thenComparing(Book::getAuthor));
这样排序后,同一分类的书会挨在一起,而且按作者姓名顺序排列~
要是你用的是Java 8之前的版本,也可以用Collections.sort()配合匿名内部类实现,比如按分类升序:
Collections.sort(bookList, new Comparator<Book>() { @Override public int compare(Book b1, Book b2) { return b1.getCategory().compareTo(b2.getCategory()); } });
内容的提问来源于stack exchange,提问作者Sk21code
相关产品推荐
相关产品推荐

