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

如何在Java函数式代码中用泛型实现通用ID打印方法

泛型适配多类型实体的ID收集方法实现

基础泛型改造方案

直接给printObjectIds方法添加泛型参数<T>,将方法内所有Fruit类型替换为泛型T,即可适配任意拥有ID属性的实体类:

void audit() {
    // 修正拼写错误:frutisRepository -> fruitsRepository,方法引用修正为getId()
    printObjectIds(fruitsRepository::findAll, Fruit::getId, "Fruits");
    printObjectIds(vegetablesRepository::findAll, Vegetable::getId, "Vegetables");
    printObjectIds(drinksRepository::findAll, Drink::getId, "Drinks");
}

// 新增泛型<T>,替换所有Fruit相关类型为T
<T> void printObjectIds(Supplier<List<T>> supplier, Function<T, Integer> idExtractor, String type) {
    List<Integer> objectIds = supplier.get()
        .stream()
        .map(idExtractor)
        .toList();

    // 修正日志变量错误与循环打印逻辑
    log.info("Type: {}", type);
    objectIds.forEach(id -> log.info("Item ID: {}", id));
}

优化方案:通过公共接口约束实体

如果所有实体类(Fruit、Vegetable、Drink等)都有统一的getId()方法,可以定义公共接口来约束,进一步简化代码:

  1. 定义HasId接口:
interface HasId {
    Integer getId();
}
  1. 让所有实体类实现该接口:
class Fruit implements HasId {
    @Override
    public Integer getId() {
        // 实现ID返回逻辑
    }
}
// Vegetable、Drink类同理实现HasId接口
  1. 简化printObjectIds方法,无需传递ID提取函数:
void audit() {
    printObjectIds(fruitsRepository::findAll, "Fruits");
    printObjectIds(vegetablesRepository::findAll, "Vegetables");
    printObjectIds(drinksRepository::findAll, "Drinks");
}

void printObjectIds(Supplier<List<? extends HasId>> supplier, String type) {
    List<Integer> objectIds = supplier.get()
        .stream()
        .map(HasId::getId)
        .toList();

    log.info("Type: {}", type);
    objectIds.forEach(id -> log.info("Item ID: {}", id));
}

原代码中的关键错误修正

  • 拼写错误:frutisRepository → fruitsRepository
  • 方法引用错误:Fruit::Id → Fruit::getId(ID需通过方法获取)
  • 日志变量错误:log.info("Type: {}", code) → log.info("Type: {}", type)
  • 循环打印逻辑错误:原代码会重复打印整个ID列表,改为打印单个ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:52:35