微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于 Java 中的对象类型在列表中显示元素

如何解决基于 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 举报,一经查实,本站将立刻删除。