如何在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()方法,可以定义公共接口来约束,进一步简化代码:
- 定义
HasId接口:
interface HasId { Integer getId(); }
- 让所有实体类实现该接口:
class Fruit implements HasId { @Override public Integer getId() { // 实现ID返回逻辑 } } // Vegetable、Drink类同理实现HasId接口
- 简化
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
相关产品推荐
相关产品推荐

