【问题标题】:Display elements in a list based off object type in Java在 Java 中基于对象类型在列表中显示元素
【发布时间】:2025-12-08 23:30:01
【问题描述】:

假设我有一个名为 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<>();

}

【问题讨论】:

    标签: java arraylist methods collections instanceof


    【解决方案1】:

    您可以构建一个 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

    【讨论】:

      【解决方案2】:

      如果我以后想添加另一辆车

      这是一个正确的问题,你明白了。这个想法是让你的代码独立于实际的类,并且对新情况足够通用。


      为此,您可以使用 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()));
      }
      

      【讨论】:

      • 谢谢!我还没有地图,但我会调查一下。使用这种方法,我有没有办法,例如,假设客户想要购买 3 辆自行车,而我们只有 2 辆,将 getCounts() 的返回值与客户的输入进行比较?
      最近更新 更多