2014-10-16 74 views
0

我有3个对象使用Java的instanceof但基于方法参数

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(如果它是字符串或其他更好的)类似的东西:

if (i instanceof carTypeGiven) 

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

+0

然后,您需要两个int计数变量smallCarCount和largeCarCount。总数当然是他们的总和。 – 2014-10-16 20:33:13

回答

3

传入类而不是指示所需类型的字符串。你可以把它限制在这样的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

+0

我认为这是我正在寻找的!谢谢... – 2014-10-16 20:49:38

+0

+1为包含Java 8流做这种过滤! – Krease 2014-10-16 21:06:16