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

如何用Lambda封装返回类型各异的Java模板代码?

重构方案

首先解决原代码的一个问题:两个getSomething方法仅返回类型不同,这不符合Java方法重载规则(重载要求参数列表存在差异),因此重构时需要为方法设置不同名称,或通过参数区分。

接下来通过泛型+Lambda封装重复模板代码,实现业务方法仅保留核心逻辑:

import java.util.List;
import java.util.concurrent.Callable;

public class DataFetcher {
    // 封装所有重复模板逻辑的通用工具方法
    private static <T> T executeWithBoilerplate(Callable<T> businessLogic) {
        // 此处放置try块之前的重复模板代码
        try {
            // 此处放置try块内的重复模板代码
            return businessLogic.call();
        } catch (Exception e) {
            // 此处放置catch块内的重复模板代码(如日志记录、异常转换等)
            throw new RuntimeException("业务逻辑执行失败", e); // 示例异常处理,可根据需求调整
        }
    }

    // 重构后的字符串列表方法,仅保留核心返回逻辑
    public static List<String> getStringSomething() {
        return executeWithBoilerplate(() -> List.of("1", "2", "3"));
    }

    // 重构后的整数列表方法,仅保留核心返回逻辑
    public static List<Integer> getIntegerSomething() {
        return executeWithBoilerplate(() -> List.of(1, 2, 3));
    }

    // 支持自定义类返回的示例
    public static CustomEntity getCustomSomething() {
        return executeWithBoilerplate(() -> new CustomEntity("示例数据"));
    }
}

// 自定义类示例
class CustomEntity {
    private String data;
    public CustomEntity(String data) {
        this.data = data;
    }
}

核心逻辑说明

  • 泛型方法executeWithBoilerplate接收Callable<T>类型参数,既可以封装任意返回类型的业务逻辑,也能兼容检查型异常抛出(匹配原代码catch Exception的场景)。
  • 所有重复的模板代码(前置准备操作、try块内通用逻辑、catch块异常处理)都集中在工具方法中,业务方法仅通过Lambda传递核心返回逻辑,彻底消除代码冗余。
  • 支持任意返回类型:无论是集合、基本类型包装类、自定义类,只需在Lambda中返回对应类型即可,泛型会自动完成类型推导。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:15:17