2017-06-02 40 views
3

總結通用的數字我有以下情形:如何在Java

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

我什麼都不知道(故意)大約T t,除了它是一個數字,它可以被比喻爲「兄弟姐妹」(需要整理東東...)。

很明顯,這不起作用,它不會以舊Java的方式工作(即循環),因爲根據我所知,您根本無法做到T x = 0

這兩個都不會工作,我認爲相同的原因和事實,即T不執行總和;此外,我讀它不會在空集。

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

那麼該怎麼做?

編輯:請考慮T可以從字節什麼一個BigDecimal,它迫使一個整數可能意味着丟失數據

+0

你是如何創建'list_of_Ts'? – alayor

+0

@alayor它實際上來自一個HashMap.entrySet() –

+0

@alayor這並不重要。它可以通過構造函數傳遞,也可以在內部創建,並用'void add(T e){list_of_Ts.add(e);}'方法填充。重要的是,我們可以假設我們可以訪問'List list_of_Ts',它可能包含一些'T'元素。 – Pshemo

回答

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. 
+0

你可以擴大一點嗎?我不認爲我知道了。你的意思是_.reduce(0,(x,y) - > x + y)_? –