【问题标题】:Java using instanceof but based on method argumentJava 使用 instanceof 但基于方法参数
【发布时间】:2014-10-16 20:27:05
【问题描述】:

我有 3 个对象

Car
SmallCar extends Car
LargeCar extends Car

使用这种方法我想在列表中计算特定类型的汽车:

public int availableCars(String carType) {
    int count = 0;
    for (Car i : fleet) {
        if (i instanceof SmallCar) {
            count++;
        }
    }
    return count;
}

传递给定的carType的最佳方法是什么(如果它是String或其他更好的东西)具有类似的东西:

if (i instanceof carTypeGiven)

该方法返回有多少特定类型的汽车可用。

【问题讨论】:

  • 那么你需要两个 int 计数变量,smallCarCount 和 largeCarCount。总数当然是他们的总和。

标签: java object instanceof


【解决方案1】:

传入类而不是指示所需类型的字符串。您可以使用如下通配符将其限制为 Car 的子类:Class<? extends Car>

public int availableCars(Class<? extends Car> carType) {
    int count = 0;
    for (Car car : fleet) {
        if (carType.isInstance(car)) {
            count++;
        }
    }
    return count;
}

使用Class.isInstance(Object) 确定车队中的汽车是否属于所需类型。

还可以使用 Java 8 的流更简洁地做到这一点(假设 fleet 是一个集合):

public long availableCars(Class<? extends Car> carType) {
    return fleet.stream().filter(carType::isInstance).count();
}

如果fleet 是一个数组,则需要稍有不同:

public long availableCars(Class<? extends Car> carType) {
    return Arrays.stream(fleet).filter(carType::isInstance).count();
}

请注意,我已将返回类型更改为 long,因为这是 Stream.count() 返回的内容。您也可以将返回类型保留为 int,并将结果从 count() 转换为 int

【讨论】:

  • +1 用于包含 Java 8 流来进行这种过滤!
猜你喜欢
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
相关资源
最近更新 更多