2017-07-04 92 views
5

我怎樣才能通過lambda表達式可選參數科特林語言科特林lambda表達式作爲可選參數

val max = { a: Int, b: Int -> 
    if (a > b) 
     a 
    else 
     b 
} 

我必須要通過上面的東西就像是可選參數

+1

你想把這個lambda傳遞給什麼? – zsmb13

+0

注意,JDK中已經有一個'max'函數,可以通過'Math.max(a,b)'進行訪問,它可以執行相同的操作。 – Robin

+0

關於你的問題,我真的不明白你在問什麼 - 你可以將'max'作爲普通參數傳遞給任何函數調用,該函數調用採用'(Int,Int) - > Int'形式的函數。 – Robin

回答

0

,您可以使用max作爲默認功能

fun someDefault(f: (a: Int, b: Int) -> Int = max) { 
    f(1, 7) 
    // do something 
} 

或者你也可以用lambda作爲參數是可選的

fun someOptional(f: ((a: Int, b: Int) -> Int)? = null) { 
    f?.invoke(1, 7) 
} 

在這兩種情況下(默認和可選)定義了一個方法,你可以指定用於呼叫的拉姆達或者你可以忽略它

fun call() { 
    someDefault() 
    someDefault { a, b -> a * b} 

    someOptional() 
    someOptional { a, b -> a * b} 
} 
5

以下定義了接受函數的函數,併爲傳遞的函數指定默認值(如果沒有提供)。

fun foobar(fn: (a: Int, b: Int) -> Int = { a: Int, b: Int -> if (a > b) a else b }) { 
    println(fn(42, 99)) 
} 

你可以通過自己的函數:

val min = { a: Int, b: Int -> if (a <= b) a else b } 
foobar(min) 

val max = { a: Int, b: Int -> if (a > b) a else b } 
foobar(max) 

可以省略的功能和使用默認:

foobar() 

另外,您可以參考標準庫maxOf功能的默認,而不是自己寫:

fun foobar(fn: (a: Int, b: Int) -> Int = ::maxOf) { 
    println(fn(42, 99)) 
}