如何避免含相同参数的代码重复?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
相关产品推荐
相关产品推荐

