Java中如何筛选集合内特定子类实例?以Voiture类为例
解决Java中筛选Voiture子类实例的问题
原代码存在的问题
- 未获取迭代器当前元素:循环里只判断了
hasNext(),但没调用iterator.next()拿到要判断的车辆实例 - 类型判断逻辑错误:
vehicules.equals(voiture)完全不成立,既没有定义voiture变量,也不是判断对象类型的正确方式,应该用instanceof关键字 - 打印对象错误:输出的是迭代器本身,而非筛选出的车辆实例
- 迭代器未使用泛型:原始
Iterator会导致类型不安全,建议指定泛型Iterator<Vehicule>
修正后的迭代器实现
List<Vehicule> vehicules = new ArrayList<>(); public void getVehicules() { vehicules.forEach(System.out::println); } public void getVoitures() { Iterator<Vehicule> iterator = vehicules.iterator(); while (iterator.hasNext()) { Vehicule vehicule = iterator.next(); // 判断当前实例是否为Voiture类型 if (vehicule instanceof Voiture) { System.out.println(vehicule); } } }
更简洁的Java 8+ Stream实现
如果你的项目使用Java 8及以上版本,用Stream API可以写出更简洁的代码:
public void getVoitures() { vehicules.stream() .filter(vehicule -> vehicule instanceof Voiture) .forEach(System.out::println); }
扩展:强制转换调用子类特有方法
如果需要调用Voiture类特有的方法,可以在筛选后进行类型转换:
public void getVoitures() { vehicules.stream() .filter(Voiture.class::isInstance) .map(Voiture.class::cast) .forEach(voiture -> { System.out.println(voiture); // 调用Voiture特有的方法,比如voiture.activateAirbag(); }); }
内容的提问来源于stack exchange,提问作者SayarS
相关产品推荐
相关产品推荐

