Eclipse Collectionsを使用している場合は、メソッドを持つMutableStackを使用できますsumOfInt()
。
Car honda = new Car("Honda", 19000);
Car toyota = new Car("Toyota", 18000);
Car bmw = new Car("BMW", 40000);
MutableStack<Car> carStack =
ArrayStack.newStackFromTopToBottom(honda, toyota, bmw);
long price = carStack.sumOfInt(new IntFunction<Car>()
{
@Override
public int intValueOf(Car eachCar)
{
return eachCar.getPrice();
}
});
Assert.assertEquals(77000, price);
質問は、各車に多数のオカレンスがあることに言及しています。おそらく、BagはStackIterable
. はアイテムと、そのアイテムが で何回発生したBag
かを追跡しますBag
。numberOfCars
からフィールドを削除することを意味しCar
ます。
MutableBag<Car> carBag = HashBag.newBag();
carBag.addOccurrences(honda, 200);
carBag.addOccurrences(toyota, 300);
carBag.addOccurrences(bmw, 150);
long price = carBag.sumOfInt(new IntFunction<Car>()
{
@Override
public int intValueOf(Car eachCar)
{
return eachCar.getPrice();
}
});
Assert.assertEquals(15200000, price);
Java 8 がリリースされると、匿名内部クラスをラムダまたはメソッド参照に置き換えることができます。メソッド参照を含むコードは次のようになります。
long price = carBag.sumOfInt(Car::getPrice);
price が int ではなく double の場合は、 に置き換えるだけsumOfInt()
で済みsumOfDouble()
ます。
long price = carBag.sumOfDouble(Car::getPrice);
注:私は Eclipse コレクションのコミッターです。