You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将处理不同自定义类型列表的重复逻辑封装为通用方法?

实现通用统计方法的方案

完全可以实现这个通用方法,核心是通过函数式接口抽象从不同类中提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:45:44