2017-03-23 100 views
3

我得到这个方法一般化的方法

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

,我想推广到实现该方法总和(例如浮点型)的任何类。

是否有可能通过使用Java泛型来实现这一点?

+0

不,事实并非如此。抱歉。 –

+1

@khelwood这是一个静态方法,所以超类不相关。 – shmosel

+0

@shmosel好点。 – khelwood

回答

5

不幸的是,Number基类没有sum方法,所以你不能直接这样做。你可以做什么,但是,是呼吁收到的每条NumberdoubleValue(),总结他们的双打:

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

为什么不使用'Double :: sum'? – shmosel

+0

谢谢@Mureinik – user3727540

+1

@shmosel好点,谢谢 - 我会编辑它。绝对比使用'a + b'自己重新实现它更优雅。 – Mureinik

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); 

但我不相信你会做这个获得任何。