我得到这个方法一般化的方法
public static Integer addCollectionElements(List<Integer> list) {
return list.stream().reduce(0, Integer::sum).intValue();
}
,我想推广到实现该方法总和(例如浮点型)的任何类。
是否有可能通过使用Java泛型来实现这一点?
我得到这个方法一般化的方法
public static Integer addCollectionElements(List<Integer> list) {
return list.stream().reduce(0, Integer::sum).intValue();
}
,我想推广到实现该方法总和(例如浮点型)的任何类。
是否有可能通过使用Java泛型来实现这一点?
不幸的是,Number
基类没有sum
方法,所以你不能直接这样做。你可以做什么,但是,是呼吁收到的每条Number
doubleValue()
,总结他们的双打:
public static double addCollectionElements(List<? extends Number> list){
return list.stream().mapToDouble(Number::doubleValue).sum();
}
为什么不使用'Double :: sum'? – shmosel
谢谢@Mureinik – user3727540
@shmosel好点,谢谢 - 我会编辑它。绝对比使用'a + b'自己重新实现它更优雅。 – Mureinik
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);
但我不相信你会做这个获得任何。
不,事实并非如此。抱歉。 –
@khelwood这是一个静态方法,所以超类不相关。 – shmosel
@shmosel好点。 – khelwood