如何将处理不同自定义类型列表的重复逻辑封装为通用方法?
实现通用统计方法的方案
完全可以实现这个通用方法,核心是通过函数式接口抽象从不同类中提取countOfRows的逻辑,具体操作如下:
1. 编写通用方法
修正你代码中的语法问题(比如isEmpty()是方法需加括号、集合要先转Stream才能调用map),同时引入Function<T, Long>作为参数传递属性提取逻辑:
private <T> Long calculateTotalRows(List<T> countsList, Function<T, Long> countExtractor) { if (countsList == null || countsList.isEmpty()) { return 0L; } return countsList.stream() .map(countExtractor) .filter(Objects::nonNull) // 避免null值导致求和异常 .mapToLong(Long::longValue) .sum(); }
2. 调用通用方法
处理FooCounts和DooCounts列表时,直接传递对应的方法引用即可:
List<FooCounts> fooCounts = ...; List<DooCounts> dooCounts = ...; // 分别统计两个列表的总数 Long fooTotal = calculateTotalRows(fooCounts, FooCounts::getCountOfRows); Long dooTotal = calculateTotalRows(dooCounts, DooCounts::getCountOfRows); // 完全匹配你原逻辑的写法 Long countOfRows = 0L; countOfRows = calculateTotalRows(fooCounts, FooCounts::getCountOfRows); countOfRows = calculateTotalRows(dooCounts, DooCounts::getCountOfRows);
可选优化:定义公共接口(若允许修改实体类)
如果你有权修改FooCounts和DooCounts,可以定义一个公共接口让两者实现,进一步简化方法:
public interface RowCountable { Long getCountOfRows(); } // 修改实体类实现接口 @Data @NoArgsConstructor @AllArgsConstructor public class FooCounts implements RowCountable { private Long countOfRows; } @Data @NoArgsConstructor @AllArgsConstructor public class DooCounts implements RowCountable { private Long countOfRows; }
此时通用方法可以简化为:
private Long calculateTotalRows(List<? extends RowCountable> countsList) { if (countsList == null || countsList.isEmpty()) { return 0L; } return countsList.stream() .map(RowCountable::getCountOfRows) .filter(Objects::nonNull) .mapToLong(Long::longValue) .sum(); }
调用时无需传递提取函数:
Long fooTotal = calculateTotalRows(fooCounts); Long dooTotal = calculateTotalRows(dooCounts);
内容的提问来源于stack exchange,提问作者Yoki saga
相关产品推荐
相关产品推荐

