概括方法

时间:2017-03-23 20:37:48

标签: java generics java-8 java-stream

我有这个方法

public static Integer addCollectionElements(List<Integer> list) {
    return list.stream().reduce(0, Integer::sum).intValue();
} 

我想概括为任何实现方法总和的类(例如Float)。

是否可以通过使用Java Generics实现这一目标?

2 个答案:

答案 0 :(得分:5)

不幸的是,Number基类没有sum方法,因此您无法直接执行此操作。但是,您可以执行的操作是在您收到的每个doubleValue()上致电Number,并将它们作为双打加起来:

public static double addCollectionElements(List<? extends Number> list){
    return list.stream().mapToDouble(Number::doubleValue).sum();
}

答案 1 :(得分:4)

Integer.sum()只是一种静态方法,可以用作BinaryOperator。没有办法使它“对于具有方法sum”的对象是“通用的”。 你可以做的是在方法中添加两个参数,在这里您可以提供自己的sum函数和初始值 - 在您的情况下为零。一个极端的例子是:

public static <T extends Number> T addCollectionElements(List<T> list, T initialValue, BinaryOperator<T> sumFunction){
    return list.stream().reduce(initialValue, sumFunction);
}

调用看起来像这样:

addCollectionElements(list, 0, Integer::sum);

但我不相信你这样做会获得任何收益。