2017-07-04 41 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)) 
}