在 Kotlin - Android 中如何将函数作为参数传递?

6
如何使用Kotlin在Android中传递函数。如果我知道函数的名称,我就可以传递它:
fun a(b :() -> Unit){
}
fun b(){
}

我想传递任何函数,例如:
fun passAnyFunc(fun : (?) ->Unit){}

当你说“任何函数”时,你是真的意味着“可能存在的每个单个函数”,还是只是“接受某些类型参数并返回Unit的任何函数”? - Sweeper
将任何类型的函数作为函数参数传递?现在明白了吗? - Skand kumar
那是不可能的。这开始听起来像一个 XY 问题。你打算用传入的函数(它可以接受任意数量的参数并返回任何类型)做什么? - Sweeper
嗨,@Sweeper,以下是答案。 - Skand kumar
4个回答

22

您可以按照以下方式使用匿名函数或lambda表达式

fun main(args: Array<String>) {

    fun something(exec: Boolean, func: () -> Unit) {
        if(exec) {
            func()
        }
    }

    //Anonymous function
    something(true, fun() {
        println("bleh")
    })

    //Lambda
    something(true) {
        println("bleh")
    }

}

谢谢Yaswant Narayan。这正是我所期望的。 - Skand kumar
你也可以像这样传递lambda表达式: something(true) { prinln("bleh") } - Yaswant Narayan
怎么样?我没听懂你的意思。 - Skand kumar
something() 接受两个参数。一个是布尔值,另一个是函数本身。因此 something() 成为了高阶函数。对于第二个参数,我们传递了一个称为 lambda 的东西,它只是一个用 { ... } 包围的函数体。由于 something() 接受一个函数作为其最后一个参数(大多数高阶函数都是这样),我们可以像我之前的帖子一样在函数调用外部传递 lambda。 - Yaswant Narayan

7

方法作为参数示例:

fun main(args: Array<String>) {
    // Here passing 2 value of first parameter but second parameter
    // We are not passing any value here , just body is here
    calculation("value of two number is : ", { a, b ->  a * b} );
}

// In the implementation we will received two parameter
// 1. message  - message 
// 2. lamda method which holding two parameter a and b
fun calculation(message: String, method_as_param: (a:Int, b:Int) -> Int) {
     // Here we get method as parameter and require 2 params and add value
     // to this two parameter which calculate and return expected value
     val result = method_as_param(10, 10);

     // print and see the result.
     println(message + result)
}

3

使用接口:

interface YourInterface {
    fun functionToCall(param: String)
}

fun yourFunction(delegate: YourInterface) {
  delegate.functionToCall("Hello")
}

yourFunction(object : YourInterface {
  override fun functionToCall(param: String) {
    // param = hello
  }
})

我可以传递任何接口,因此我需要为不同的方法创建不同的接口。 - Skand kumar

1

首先在Oncreate函数中声明一个lambda函数(没有名称的函数称为lambda函数。它来自kotlin标准库而不是以{}开头的kotlin语言)如下所示:

 var lambda={a:Int,b:Int->a+b}

现在创建一个函数,接受另一个函数作为参数,如下所示。
fun Addition(c:Int, lambda:(Int, Int)-> Int){
    var result = c+lambda(10,25)
    println(result)

}

现在,在onCreate函数中通过传递lambda表达式作为参数调用Addition函数,如下所示。
Addition(10,lambda)//  output 45

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接