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

如何避免含相同参数的代码重复?Lambda是否适用?

解决重复轮询代码的方案

核心思路

把固定的轮询配置(pollInterval/pollDelay/atMost)和统一的异常处理逻辑封装成工具方法,通过Lambda表达式传递不同的业务检查逻辑,彻底消除代码重复。

步骤1:封装工具类

创建一个静态工具类,将重复的try-catch和轮询模板代码集中起来:

import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

public class PollingUtils {
    // 基础版:使用固定轮询配置
    public static void pollUntil(Supplier<Boolean> condition) {
        try {
            await().pollInterval(5, TimeUnit.SECONDS)
                   .pollDelay(500, TimeUnit.MILLISECONDS)
                   .atMost(30, TimeUnit.SECONDS)
                   .until(condition);
        } catch (Exception e) {
            // 统一处理异常,比如日志记录、默认降级逻辑
            // 替换成你实际的内部处理逻辑
        }
    }

    // 重载版:支持自定义超时时间(可选,应对特殊场景)
    public static void pollUntil(Supplier<Boolean> condition, long timeout, TimeUnit timeoutUnit) {
        try {
            await().pollInterval(5, TimeUnit.SECONDS)
                   .pollDelay(500, TimeUnit.MILLISECONDS)
                   .atMost(timeout, timeoutUnit)
                   .until(condition);
        } catch (Exception e) {
            // 统一异常处理
        }
    }
}

步骤2:业务代码中调用

在需要轮询的地方,直接传递业务检查逻辑即可,无需重复写轮询模板:

// 场景1:检查服务状态
PollingUtils.pollUntil(() -> {
    return service.isReady();
});

// 场景2:检查文件是否生成
PollingUtils.pollUntil(() -> {
    return new File("/target/file.txt").exists();
});

// 场景3:使用自定义超时的特殊场景
PollingUtils.pollUntil(() -> {
    return database.hasDataLoaded();
}, 60, TimeUnit.SECONDS);

为什么Lambda适用?

until()方法接收的参数本质是一个返回布尔值的函数式接口(Supplier<Boolean>或Callable<Boolean>),Lambda表达式可以直接实现这个接口,完美适配不同的业务检查逻辑,同时保持代码简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:15:43