在方法中使用不同的吸气剂

时间:2019-06-26 20:41:26

标签: java getter

给出以下方法

public int calcSum(List<MyClass> items) {
    return items.stream()
                .mapToInt(i -> i.getHeight())
                .sum();
}

使用不同的getter可以传递方法的参数时,我有什么选择,例如,我不必用getWeight()重复相同的return语句?

我当时正在考虑使用其他方法来返回吸气剂(如果可能的话),但是我很难想到一个好的实现方法。 感谢您的帮助!

1 个答案:

答案 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;
// ...

这是乏味且重复的。