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

Java中如何将两个相似重试方法合并为通用doRetry泛型方法

Java实现通用重试泛型方法的方案

核心思路

利用Java 8+提供的函数式接口封装可变的业务方法,将固定的重试逻辑抽为通用泛型方法,适配不同的业务函数调用。
你提到的func1和func2符合双入参、同返回值的特征,直接使用JDK自带的BiFunction<T, U, R>函数式接口即可承载。

具体实现

1. 定义通用泛型doRetry方法

/**
 * 通用重试方法
 * @param targetFunc 要执行的目标业务函数
 * @param param1 目标函数第一个入参
 * @param param2 目标函数第二个入参
 * @param retries 重试次数
 * @param defaultValue 默认返回值
 * @return 目标函数执行结果
 * @param <T> 目标函数第一个入参类型
 * @param <U> 目标函数第二个入参类型
 * @param <R> 目标函数返回值类型
 */
private <T, U, R> R doRetry(BiFunction<T, U, R> targetFunc, T param1, U param2, int retries, R defaultValue) {
    R result = defaultValue;
    for (int attempt = 0; attempt < retries; attempt++) {
        result = targetFunc.apply(param1, param2);
        // 可按需补充业务成功判定,符合预期直接返回,无需走完所有重试
        // 示例:if (result != null || 其他业务判断条件) return result;
    }
    return result;
}

2. 改造原有方法

原来的doRetryA和doRetryB直接调用通用方法即可,无需重复编写重试逻辑:

// 替换原有doRetryA
private SomeType doRetryA() {
    return doRetry(this::func1, a, b, retries, someEnum.enumValue);
}

// 替换原有doRetryB
private SomeType doRetryB() {
    return doRetry(this::func2, a, b, retries, someEnum.enumValue);
}

扩展说明

  • 如果你的业务函数参数个数不为2,可以选择对应函数式接口:0个入参用Supplier<R>,1个入参用Function<T,R>,3个及以上入参可以自定义函数式接口,示例:
@FunctionalInterface
public interface TriFunction<T, U, V, R> {
    R apply(T t, U u, V v);
}
  • 如果需要异常触发重试,可在doRetry的循环内补充try-catch逻辑,捕获指定异常后继续重试即可。
  • 你原贴的示例代码存在语法问题:Java无def关键字、循环没有闭合大括号,实际使用时注意修正即可。

内容的提问来源于stack exchange,提问作者Dariusz Krynicki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:24:01