Android中接口对象的自定义适配:IOperacion集合反向转换需求
嘿,这个需求在Android开发里挺常见的,我给你整理几种实用的实现方式,你可以根据项目的Java版本和实际需求来选择~
从
ArrayList<IOperacion>中筛选特定类型操作对象的方法 方法1:基础遍历 + instanceof判断
这是最直观的写法,兼容所有Java版本,适合简单场景:
// 假设这是你的操作集合 ArrayList<IOperacion> operaciones = ...; List<OperacionDivisa> divisaOperaciones = new ArrayList<>(); // 遍历集合,筛选目标类型 for (IOperacion op : operaciones) { if (op instanceof OperacionDivisa) { // 经过instanceof校验后,强制转换不会抛出ClassCastException divisaOperaciones.add((OperacionDivisa) op); } }
方法2:Java 8+ Stream API(更简洁优雅)
如果你的项目使用Java 8及以上版本,用Stream API可以写出更简洁的代码,还能封装成通用工具方法复用:
// 单次筛选写法 List<OperacionDivisa> divisaOperaciones = operaciones.stream() .filter(op -> op instanceof OperacionDivisa) .map(op -> (OperacionDivisa) op) .collect(Collectors.toList()); // 封装通用工具方法,适配所有IOperacion的子类 public static <T extends IOperacion> List<T> filterOperacionesByType(List<IOperacion> lista, Class<T> tipo) { return lista.stream() .filter(tipo::isInstance) .map(tipo::cast) .collect(Collectors.toList()); } // 调用示例:获取不同类型的操作对象 List<OperacionDivisa> divisas = filterOperacionesByType(operaciones, OperacionDivisa.class); List<OperacionLargo> largos = filterOperacionesByType(operaciones, OperacionLargo.class);
方法3:Java 14+ 模式匹配(简化类型转换)
如果你的项目已经升级到Java 14或更高版本,可以用模式匹配让代码更简洁,不用手动写强制转换:
for (IOperacion op : operaciones) { // 直接将匹配到的对象赋值给变量,无需额外转换 if (op instanceof OperacionDivisa divisaOp) { // 直接调用OperacionDivisa的专属方法 divisaOp.realizarCambioDivisa(); } else if (op instanceof OperacionOpciones opcionesOp) { opcionesOp.aplicarOpciones(); } }
小提醒
虽然上面的方法都能解决问题,但如果你的代码里频繁需要区分不同的操作类型,不妨思考下是不是可以把通用逻辑抽象到IOperacion接口中,减少类型判断的次数。不过如果是业务场景必须区分类型,那上面的方法就完全够用啦~
内容的提问来源于stack exchange,提问作者Aldridge1991
相关产品推荐
相关产品推荐

