2017-11-25 227 views
2

正如標題所說,我正在尋找使用lambda表達式來實現一些非常簡短的方法,這一切都不爲人所知。使用lambdas作爲Java中的類的方法

Python可以做到這一點,C#可以做到這一點,在某種程度上我相信即使是C++現在也可以做到。

但我試圖做一個Java類沒有成功的相同,我查了一切可能回答這個問題,沒有運氣。我寧願不使用100個函數接口來集羣我的應用程序,只是爲了能夠使用lambda表達式來處理更加微不足道的函數或方法,因爲那樣會挫敗編寫更少代碼的目的。

這是我曾嘗試(很顯然,他們沒有工作,第二個差點因爲它至少承認這樣一個事實:拉姆達在那裏:

import static java.lang.Math.*; 

class Main { 

    static double log = (double val, double base) -> Math.log(val)/Math.log(base); // First try. Python way. 

    static double log = (val, base) -> Math.log(val)/Math.log(base); // Second try. Also inspired from the 
                     // Python way, somewhat similarly to the 
                     // F# or haskell way. 

    static double log(double val, double base) -> Math.log(val)/Math.log(base); // Third try. The C# way. 

    public static void main(String[] argv){ 

     System.out.println(log(8,2)); 

    } 
} 
+4

你明白了。只需將它們作爲靜態方法實現,並且當您有例如需要DoubleBinaryOperator作爲參數的API時,可以傳遞Main :: log作爲參數。 –

回答

4

左側的類型是否正確?

static double log = (double val, double base) -> Math.log(val)/Math.log(base); 

是右手邊double的類型? 它不是。它看起來像一個功能。 因此,左側的類型也應該是一個函數。

您不必聲明很多接口,因爲它們中有很多已經存在於庫中。

我同意,DoubleBinaryOperator並不十分順口, 但是這是你在找什麼:

DoubleBinaryOperator log = (val, base) -> Math.log(val)/Math.log(base); 

非最佳的選擇,但更容易記住,本來是BiFunction

BiFunction<Double, Double, Double> log = (val, base) -> Math.log(val)/Math.log(base); 

也就是說,BiFunction是一個函數,它需要2個double參數,並返回一個double。 這不太理想,因爲它需要autobox參數和返回值。

而要實際調用這些函數,則不能簡單地編寫log(...), 您需要接口中指定的相應方法名稱。 在任何IDE中,方法名都應該很容易找到,因爲功能接口的優點是隻有一種方法(在普通標準方法的基礎上)。

有一些常見的功能界面需要記住, 然後它變得更容易。 把我的頭,FunctionConsumerSupplier, 的頂部,以及那些專門爲基本類型, IntBinaryOperatorIntUnaryOperator,等等。

+0

謝謝,現在有道理。我猜lambdas的外觀仍然處於初級階段。但是有沒有辦法可以跳過「apply」方法(或者不管是什麼情況)並簡單地寫'log(8,2)'?使函數對象本身可調用? –

+1

@RaresDima這是一個恥辱,但不幸的是,你不得不像Java那樣在C#中使用它。 –

2

這將是Java中的等價物:

DoubleBinaryOperator log = (val, base) -> Math.log(val)/Math.log(base); 
System.out.println(log.applyAsDouble(8,2)); 

,或者你可以將其解壓縮到一個方法:

public static double log(DoubleBinaryOperator doubleBinaryOperator, double val, double base){ 
     return doubleBinaryOperator.applyAsDouble(val, base); 
} 

然後執行:

System.out.println(log((val, bas) -> Math.log(val)/Math.log(bas), 8, 2)); 

看到Package java.util.function在手工採摘最合適的功能接口任務或定義自己的如果有必要