【问题标题】:how to sum generic numbers in java [duplicate]如何在java中对通用数字求和[重复]
【发布时间】:2017-06-02 18:08:43
【问题描述】:

我有以下场景:

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 可以是从 Byte 到 BigDecimal 的任何内容,并且将其强制为整数可能意味着丢失数据

【问题讨论】:

  • 你是如何创建list_of_Ts的?
  • @alayor 其实来自一个HashMap.entrySet()
  • @alayor 这并不重要。它可以通过构造函数传递,也可以在内部创建并填充void add(T e){list_of_Ts.add(e);} 方法。重要的是我们可以假设我们可以访问List&lt;T&gt; list_of_Ts,其中可能包含一些T 元素。

标签: java generics lambda java-8


【解决方案1】:

传入一个累加器函数和标识值作为参数:

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.

【讨论】:

  • 你能扩展一下吗?我不认为我明白了。你的意思是 .reduce(0, (x, y) -> x + y)?
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2014-06-15
相关资源
最近更新 更多