2015-11-23 55 views
4

這是關於lambda表達式的一個問題。我對check((h, l) -> h > l, 0);中的語法感到困惑:在Java 8中,這是什麼樣的lambda表達式語法?

check()函數需要一個Climb對象和一個int。上面的行不提供任何Climb對象。 h > l, 0是什麼意思?

interface Climb { 
    boolean isTooHigh(int height, int limit); 
} 

class Climber { 
    public static void main(String[] args) { 
    check((h, l) -> h > l, 0); 
    } 
    private static void check(Climb climb, int height) { 
    if (climb.isTooHigh(height, 1)) 
     System.out.println("too high"); 
    else 
     System.out.println("ok"); 
    } 
} 

回答

5

您的Climb接口尊重functional interface的合同,即具有單一抽象方法的接口。

因此,可以使用lambda表達式實現Climb的一個實例,也就是說,在這種情況下,這個表達式需要兩個ints作爲參數並返回布爾值。

(h, l) -> h > l是實現它的lambda表達式。 hl是參數(int),它將返回是否h > l(所以結果確實是boolean)。因此,例如你可以寫:

Climb climb = (h, l) -> h > l; 
System.out.println(climb.isTooHigh(0, 2)); //false because 0 > 2 is not true 
2

顯然,(h, l) -> h > l是λ表達式,其中所述結果是布爾類型的和0check第二參數,它是無關的lambda表達式本身; 0不屬於lambda表達式。

+0

如何在調用'check()'時將一個布爾值轉換爲Climb對象?我不明白。 –

+1

@FukuzawaYukio聽起來像你不熟悉lambda表達式實現的功能接口。去了解它:)。 – Sam

1

(h, l) -> h > l是爬升對象。當第一個參數(h)大於第二個(l)時,它是一個lambda返回true。 0是int,逗號分隔參數。

+0

爲什麼'(h,l) - > h> l'是Climb對象?我只能看到它是一個布爾值,而布爾值不能轉換爲Climb對象。 –

+2

@FukuzawaYukio the lambda'(h,l) - > h> l'可以(而且)被解釋爲函數接口Climb,因爲它匹配'boolean isTooHigh(int height,int limit);' –

+0

這是一個lambda用布爾值作爲返回類型。最後,這就是一個Climb對象,它是一個從兩個整數到一個布爾值的函數。 Java顯然有特殊的語法糖來將這種lambda轉換爲接口的匿名實現。 – JSQuareD