2014-07-17 31 views
8

我想知道是否有可能在Java 8中獲得標準運算符(+, - ,<,>,...)的方法引用。Java 8:使用方法參考獲取運算符函數對象

我想得到它,如Foo::+其中Foo是一些定義的地方,我可以得到它。 由於Java不允許在方法名稱中使用特殊字符,我不認爲這是可能的,是嗎?

如果以上方式不存在:是否有某個地方的標準操作符被定義爲Foo::plus

我知道有可能將其定義爲lambda((x, y) -> x + y),但在我看來,它可能在某些情況下更具表現力,可能會在Haskell中引用操作符的方法。

回答

7

我相信你正在尋找int Integer.sum(int, int)以及類似的方法,它們確實是由API提供的。

從列表中缺少很多方法,但是JDK不提供最後一英寸的便利,因爲即使沒有這些方法,它的大小也很大。

如果這是任何安慰,我的每個項目都有一個Util類,我傾倒這些小花絮。

+0

運算符像>,<,也是?我不知道要去哪裏看。 –

+0

有沒有一些地方可能定義了所有的操作符?一些只有靜態方法的類可能是名爲'Ops'或類似的東西? –

+0

不,我不這麼認爲。 Ther的'Integer.compare',但你仍然需要編寫一些代碼來獲得布爾謂詞。 –

0

標準運算符僅適用於基元和裝箱原語,並且不能動態地查找哪些運算符適用於所討論的對象。

編輯:如果您想知道您可以調用哪些方法來執行標準操作符函數,可以對大於/小於或等於運算符(http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)的可比較接口執行instanceof檢查。

+0

「標準操作符僅適用於基元和裝箱原語,並且不能動態地查找哪些操作符適用於所討論的對象。」我不明白這一點。我認爲編譯器可以找出,如果這些類型是合適的。 (好吧,也許我的英語太難理解了;-)) –

+0

好的,在實現'<'我明白你的意思。無法用'Number'超類來執行'<'。 –

+0

對象工作的唯一操作符是==。這是因爲它實際上並不比較對象,而只是參考(如果您熟悉C++,則使用指針)。因此,如果2個對象具有相同的內容,但它們不是相同的對象實例,它們仍然不會在==運算符上返回true。 – grimmeld

1

乾淨的方式將是一個Operators助手類,它包含所有操作符的方法。然後你可以使用這些方法作爲參考。當然,標準庫類比自己的輔助類更好,但至少你可以決定該輔助類的名稱,這樣你就可以選擇一個最能表達你的名字。