2017-07-04 66 views
5

Jak mogę przekazać lambda wyrażenie jako opcjonalny parametr w Kotlin językKotlin wyrażenia lambda jako opcjonalny parametr

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

muszę przechodzić nad rzeczą jest jak opcjonalny parametr

+1

Co chcesz przekazać temu lambda? – zsmb13

+0

Nuta boczna, istnieje już funkcja 'max' dostępna w JDK, dostępna przez' Math.max (a, b) ', która robi to samo. – Robin

+0

Co do twojego pytania, tak naprawdę nie rozumiem o co prosisz - możesz przekazać 'max' jako normalny argument do dowolnego wywołania funkcji, które przyjmuje funkcję postaci' (Int, Int) -> Int'. – Robin

Odpowiedz

0

Możesz używać max działa domyślnie

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

lub można również zdefiniować metodę z lambda jako parametru, który jest opcjonalny

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

W obu przypadkach (domyślnie i opcjonalnie) można określić lambda dla wywołania lub można po prostu pominąć go

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

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

Poniżej zdefiniowano funkcję, która przyjmuje funkcję i określa wartość domyślną dla przekazanej funkcji, jeśli żadna z nich nie została podana.

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

można przekazać własne funkcje:

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) 

Można pominąć funkcję i użyć domyślnego:

foobar() 

Ewentualnie można odnieść się do biblioteki standardowej maxOf funkcji jako domyślnie zamiast pisać własne:

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