首页 > 解决方案 > 在 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<>();

}

标签: javaarraylistmethodscollectionsinstanceof

解决方案


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

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


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

推荐阅读