243

给定函数 foo :

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

我们可以做的:

foo("a message", { println("this is a message: $it") } )
//or 
foo("a message")  { println("this is a message: $it") }

现在,假设我们有以下功能:

fun buz(m: String) {
   println("another message: $m")
}

有没有办法可以将 "buz" 作为参数传递给 "foo" ?就像是:

foo("a message", buz)
4

11 回答 11

355

Use :: to signify a function reference, and then:

fun foo(msg: String, bar: (input: String) -> Unit) {
    bar(msg)
}

// my function to pass into the other
fun buz(input: String) {
    println("another message: $input")
}

// someone passing buz into foo
fun something() {
    foo("hi", ::buz)
}

Since Kotlin 1.1 you can now use functions that are class members ("Bound Callable References"), by prefixing the function reference operator with the instance:

foo("hi", OtherClass()::buz)

foo("hi", thatOtherThing::buz)

foo("hi", this::buz)
于 2015-10-28T22:44:07.507 回答
24

关于成员函数作为参数:

  1. Kotlin 类不支持静态成员函数,所以不能像这样调用成员函数: Operator::add(5, 4)
  2. 因此,成员函数不能与 First-class 函数一样使用。
  3. 一个有用的方法是用 lambda 包装函数。它并不优雅,但至少它正在工作。

代码:

class Operator {
    fun add(a: Int, b: Int) = a + b
    fun inc(a: Int) = a + 1
}

fun calc(a: Int, b: Int, opr: (Int, Int) -> Int) = opr(a, b)
fun calc(a: Int, opr: (Int) -> Int) = opr(a)

fun main(args: Array<String>) {
    calc(1, 2, { a, b -> Operator().add(a, b) })
    calc(1, { Operator().inc(it) })
}
于 2016-05-28T04:49:18.393 回答
16

只需在方法名称前使用“::”

fun foo(function: () -> (Unit)) {
   function()
}

fun bar() {
    println("Hello World")
}

foo(::bar) 输出Hello World

于 2017-05-23T10:48:43.880 回答
8

科特林 1.1

使用::参考方法。

喜欢

    foo(::buz) // calling buz here

    fun buz() {
        println("i am called")
    }
于 2017-08-18T11:22:54.423 回答
5

如果你想传递settergetter方法。

private fun setData(setValue: (Int) -> Unit, getValue: () -> (Int)) {
    val oldValue = getValue()
    val newValue = oldValue * 2
    setValue(newValue)
}

用法:

private var width: Int = 1

setData({ width = it }, { width })
于 2019-03-19T07:52:15.723 回答
2

这是一个简单的例子,我将乘法函数作为参数传递给另一个函数。

fun main(){
    result(10,3,::multiplication)// pass function as parameter wow kotlin amazing
}
fun multiplication(first:Int,second:Int):Int{
    return first*second
}
fun result(firstOne:Int,secondOne: Int,fn:(Int,Int)->Int){
    val result=fn(firstOne,secondOne)
    print(result)

}
于 2021-03-25T16:09:39.857 回答
2

Jason Minard 的回答很好。这也可以使用lambda.

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

val buz = { m: String ->
    println("another message: $m")
}

可以用foo("a message", buz).

您也可以使用typealias.

typealias qux = (m: String) -> Unit

fun foo(m: String, bar: qux) {
    bar(m)
}

val buz: qux = { m ->
    println("another message: $m")
}
于 2019-05-10T16:59:22.607 回答
1

显然这还不被支持。

更多信息:

http://devnet.jetbrains.com/message/5485180#5485180

http://youtrack.jetbrains.com/issue/KT-1183

于 2013-04-21T03:29:26.723 回答
1

如果这是您使用该函数的唯一地方,您也可以使用 lambda 内联执行此操作

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

foo("a message") {
    m: String -> println("another message: $m")
}
//Outputs: another message: a message
于 2020-08-12T14:13:54.253 回答
0

另一个例子:

 fun foo(x:Int, Multiply: (Int) -> (Int)) {
    println(Multiply(x))
 }
 fun bar(x:Int):Int{
    return  x * x
 }
 foo(10, ::bar)
于 2019-11-28T00:37:34.467 回答
-10

Kotlin 目前不支持一流的函数。关于这是否是一个很好的添加功能一直存在争议。我个人认为他们应该。

于 2013-04-20T22:44:21.157 回答