如何解决基于 Java 中的对象类型在列表中显示元素
假设我有一个名为 Vechicle 的接口,以及两个实现它的类(Car 和 Bike)。
我想要一个包含汽车和自行车的列表。我将如何制作一种显示自行车和汽车数量的方法?我正在考虑创建一个变量来计算列表中自行车/汽车的每个实例,然后它会根据它增加它,但是,如果我以后想添加另一辆车(假设一辆卡车),那么我将不得不创建另一个变量来计算卡车的数量等等。
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()));
}
,
您可以构建一个 Map,其中键是车辆实例的 Class
,值是计数(特定类型出现在列表中的次数)。
Map<Class<? extends Vehicle>,Long> result = vehicleList.stream()
.collect(Collectors.groupingBy(Vehicle::getClass,Collectors.counting()));
假设您有两辆汽车和一辆自行车,然后打印 result
地图将打印规范类名称,例如,
{class <your_java_package_path>.Bike=1,class <your_java_package_path>.Car=2}
要获取简单的类名,请将 getSimpleName
调用为:
result.forEach((clazz,count) -> System.out.println(clazz.getSimpleName() + " " + count));
这将打印,
Bike 1
Car 2
因此,当您将来添加新的 Vehicle
类型时,无需对上述代码进行任何更改。
更新:您可以通过在构建地图本身时调整 Class#getSimpleName
来简化此操作 - 请参阅 azro's answer
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。