代码中存在多个相似Java方法,如何进行重构优化?
重构相似迭代方法,提升可维护性与扩展性
嘿,看你现在有一堆逻辑重复的书籍查询方法,核心都是遍历集合、筛选符合条件的书,只是判断条件不一样——一个按书名匹配,一个按范围筛选。这种场景下,用行为参数化的思路重构就对了,把不变的遍历逻辑和变化的筛选条件彻底分开,以后加新功能也不用重复写冗余代码。
第一步:抽离通用核心逻辑
首先把所有方法里重复的“遍历集合、收集结果”代码抽成一个通用方法,用Java的Predicate<Book>来接收筛选条件——这是个函数式接口,专门用来表示“判断对象是否符合条件”的逻辑,完美适配咱们的场景。
先写这个通用方法,顺便把字符串拼接换成StringBuilder(多本书的时候效率更高,避免生成一堆临时字符串):
private String getMatchingBooksDetails(Predicate<Book> bookFilter) { StringBuilder bookDetails = new StringBuilder(); Iterator<Book> iterator = allBooks.iterator(); while (iterator.hasNext()) { Book b = iterator.next(); if (bookFilter.test(b)) { if (bookDetails.length() > 0) { bookDetails.append("\n"); // 多本书的话换行分隔结果 } bookDetails.append(b.toString()); } } return bookDetails.toString(); }
第二步:简化原有方法,复用通用逻辑
现在原来的两个方法就变得超级简洁,只需要把各自的筛选条件传进去就行:
public void getParticularBook(String nameOfBook) { String details = getMatchingBooksDetails(book -> book.getTitle().equalsIgnoreCase(nameOfBook) ); System.out.println(details); } public void getBooksDataOnRange(int from, int to) { // 这里假设是按价格范围筛选,你可以根据实际需求改成页码/出版年份等 String details = getMatchingBooksDetails(book -> book.getPrice() >= from && book.getPrice() <= to ); System.out.println(details); }
第三步:未来新增方法的扩展性拉满
以后要加新的查询?比如“找某个作者的所有书”,只需要几行代码搞定,完全不用再写遍历逻辑:
public void getBooksByAuthor(String authorName) { String details = getMatchingBooksDetails(book -> book.getAuthor().equalsIgnoreCase(authorName) ); System.out.println(details); }
你只需要关注筛选条件本身,核心的遍历、结果收集逻辑全复用,代码维护起来轻松太多。
额外优化:分层处理更灵活
如果以后需要返回List<Book>而不是拼接好的字符串,还可以再抽一个更底层的通用方法,把“找符合条件的书”和“把书转成字符串”彻底分开:
private List<Book> findMatchingBooks(Predicate<Book> bookFilter) { List<Book> matchingBooks = new ArrayList<>(); // 用增强for循环比Iterator更简洁,代码可读性更高 for (Book b : allBooks) { if (bookFilter.test(b)) { matchingBooks.add(b); } } return matchingBooks; }
然后原来的getMatchingBooksDetails就可以基于这个方法实现:
private String getMatchingBooksDetails(Predicate<Book> bookFilter) { List<Book> matchingBooks = findMatchingBooks(bookFilter); StringBuilder sb = new StringBuilder(); for (Book book : matchingBooks) { if (sb.length() > 0) sb.append("\n"); sb.append(book.toString()); } return sb.toString(); }
这样分层更清晰,不管是要拿书籍对象集合,还是要拿拼接好的字符串,都能复用核心的筛选逻辑,灵活性拉满。
内容的提问来源于stack exchange,提问作者Dawid
相关产品推荐
相关产品推荐

