如何在java中总结通用数字

时间:2017-06-02 18:08:43

标签: java generics lambda java-8

我有以下情况:

class MyListOfNumbers<T extends Number & Comparable<T>>
{
    public T sum()
    {
        return list_of_Ts.stream()
        .sum();
    }
}

我对T一无所知(故意)除了它是一个数字,它可以与“兄弟姐妹”进行比较(需要对东西进行排序......)。

显然这不起作用,它不会以旧的Java方式(即循环)工作,因为据我所知,你根本不能做T x = 0

这不会起作用,我认为同样的原因和 T 没有实现 sum 的事实;而且我读过它对空集无效。

class MyListOfNumbers<T extends Number & Comparable<T>>
{
    public T sum()
    {
        return list_of_Ts.stream()
        .reduce(0, T::sum);
    }
}

然后该怎么做?

编辑:请考虑T可以是从字节到BigDecimal的任何内容,并强制它为整数可能意味着丢失数据

1 个答案:

答案 0 :(得分:3)

将累加器函数和标识值作为参数传递:

public T sum(T identity, BinaryOperator<T> accumulator) {
  return list_of_Ts.stream().reduce(identity, accumulator);
}

请注意,如果您想避免在实际调用它时传递这些内容,可以创建静态方法来执行调用:

public static int intSum(MyListOfNumbers<Integer> list) {
  return list.sum(0, (a, b) -> a + b);
}

public static double doubleSum(MyListOfNumbers<Double> list) {
  return list.sum(0, (a, b) -> a + b);
}

// etc.