给出以下方法
public int calcSum(List<MyClass> items) {
return items.stream()
.mapToInt(i -> i.getHeight())
.sum();
}
使用不同的getter可以传递方法的参数时,我有什么选择,例如,我不必用getWeight()
重复相同的return语句?
我当时正在考虑使用其他方法来返回吸气剂(如果可能的话),但是我很难想到一个好的实现方法。 感谢您的帮助!
答案 0 :(得分:10)
传入ToIntFunction<T>
作为参数:
public <T> int calcSum(List<T> items, ToIntFunction<? super T> fn) {
return items.stream()
.mapToInt(fn)
.sum();
}
// Example invocations:
int heightSum = calcSum(items, MyClass::getHeight);
int weightSum = calcSum(items, MyClass::getWeight);
<? super T>
是一个bounded wildcard(尤其是下界通配符)。它只是使API更加灵活。例如,由于通配符,您可以调用:
ToIntFunction<Object> constantValue = a -> 1;
int count = calcSum(items, constantValue);
由于constantValue
接受任何Object
,因此它也可以接受MyClass
实例。
没有界限,您将无法传递ToIntFunction<Object>
:对于不同的列表元素类型,您需要具有单独的实例:
ToIntFunction<MyClass> constantValueForMyClass = a -> 1;
ToIntFunction<MyOtherClass> constantValueForMyOtherClass = a -> 1;
ToIntFunction<YetAnotherClass> constantValueForYetAnotherClass = a -> 1;
// ...
这是乏味且重复的。