java - 在 Java 中基于对象类型在列表中显示元素
问题描述
假设我有一个名为 Vechicle 的接口,以及实现它的两个类(汽车和自行车)。
我想要一个包含汽车和自行车的列表。我将如何制作一种显示自行车和汽车数量的方法?我正在考虑创建一个变量来计算列表中自行车/汽车的每个实例,然后根据它增加它,但是,如果我以后想要添加另一辆车(假设是卡车),那么我将不得不创建另一个变量来计算卡车的数量等等。
public interface Vehicle {
void vehicleName();
}
public class Car implements Vehicle{
@Override
public String vehicleName() {
System.out.println("I'm a car");
}
}
public class Bike implements Vehicle{
@Override
public String vehicleName() {
System.out.println("I'm a bike");
}
}
public class Transportation {
List<Vehicle> vehicleList = new ArrayList<>();
}
解决方案
如果我以后想添加另一辆车
是一个正确的问题,你明白了。这个想法是让你的代码独立于实际的类,并且对新情况足够通用。
为此,您可以使用Map
将类名存储为键并计为值的
Map<String, Integer> getCounts() {
Map<String, Integer> counts = new HashMap<>();
for (Vehicle v : vehicleList) {
counts.merge(v.getClass().getSimpleName(), 1, Integer::sum);
}
return counts;
}
使用Stream
它可以完成Collectors.groupingBy
Map<String, Long> getCounts() {
return vehicleList.stream()
.collect(Collectors.groupingBy(v -> v.getClass().getSimpleName(), Collectors.counting()));
}
推荐阅读
- r - 在我第一次尝试 R Shiny 后,R Markdown 无法正常工作
- api - Flutter 将 API 值返回给 FutureBuilder Null
- python - 在熊猫应用函数中获取一行的列
- javascript - 输入按键在 datepicker jquery 中不起作用
- archive - 为什么 get_post_type_archive_link 不能正常工作?
- python - 嵌套循环的并行性
- python - 了解 AttributeError 的原因
- stack - 如何在 .equate 中编写此 pep8 代码并将其存储在堆栈中
- android - Android.mk 子目录的构建问题
- sqlite - sqlite flutter中没有保存一些数据库字段,如何在数据库中检查?