如何在kotlin中将lambda用作回调

如何在kotlin中将lambda用作回调,kotlin,Kotlin,假设我有一门课,比如: class Testing() { var var1 = 0 var str1 = "" var b = false fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){ this.var1 = var1 this.str1 = str1 // do something } } 如何调用方法test并通过boolean来运行la

假设我有一门课,比如:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
    this.var1 = var1 
    this.str1 = str1 
    // do something
    }
}
如何调用方法test并通过boolean来运行lambda body

var t1 = Testing()
t1.test(1, "String"){
      // do something else
}

您需要命名lambda参数,或者,如果不使用该参数,则将其命名为
\uuu

像这样:

fun example1() {
    var t1 = Testing()
    t1.test(1, "String") { bool ->
        // Do stuff
    }
}

fun example2() {
    var t1 = Testing()
    t1.test(1, "String", { bool -> 
        // Do stuff
    })
}
我假定您想在
Testing
类的
test
方法中调用回调。在这种情况下,您需要向函数提供参数,以便使用arg调用lambda。我可以这样做:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambdaArg: Boolean, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        // Invoke the callback
        lambda1(lambdaArg)
    }
}
class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        if (this.var1 == 0) {
            lambda1(false)
        } else { 
            lambda1(true)
        }
    }
}
或者,如果要传递给lambda的参数是
test
函数中发生的函数,则可以将lambda参数提供给
test
,而不是在调用lambda时硬编码参数,如下所示:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambdaArg: Boolean, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        // Invoke the callback
        lambda1(lambdaArg)
    }
}
class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        if (this.var1 == 0) {
            lambda1(false)
        } else { 
            lambda1(true)
        }
    }
}

您需要命名lambda参数,或者,如果不使用该参数,则将其命名为
\uuu

像这样:

fun example1() {
    var t1 = Testing()
    t1.test(1, "String") { bool ->
        // Do stuff
    }
}

fun example2() {
    var t1 = Testing()
    t1.test(1, "String", { bool -> 
        // Do stuff
    })
}
我假定您想在
Testing
类的
test
方法中调用回调。在这种情况下,您需要向函数提供参数,以便使用arg调用lambda。我可以这样做:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambdaArg: Boolean, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        // Invoke the callback
        lambda1(lambdaArg)
    }
}
class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        if (this.var1 == 0) {
            lambda1(false)
        } else { 
            lambda1(true)
        }
    }
}
或者,如果要传递给lambda的参数是
test
函数中发生的函数,则可以将lambda参数提供给
test
,而不是在调用lambda时硬编码参数,如下所示:

class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambdaArg: Boolean, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        // Invoke the callback
        lambda1(lambdaArg)
    }
}
class Testing() {
    var var1 = 0
    var str1 = ""
    var b = false

    fun test(var1: Int, str1: String, lambda1: (Boolean)->Unit){
        this.var1 = var1
        this.str1 = str1
        if (this.var1 == 0) {
            lambda1(false)
        } else { 
            lambda1(true)
        }
    }
}
其他地方:

test(1, "one") {
  // this is now your lambda1-function-body accepting a boolean...
  // here you now have three(+) ways to implement it...
}
lambda1车身的变型:

  • 忽略给定的布尔值:

    test(1, "one") { // _ -> // <- you can write this out explicitly if you like
      println("boolean value is ignored here")
    }
    
  • 方法参考:

    fun anythingThatConsumesABoolean(bool : Boolean) { }
    
    test(1, "one", ::anythingThatConsumesABoolean)
    
  • 如您所见:您不会从外部传递布尔值,而是在回调函数中处理它

    其他地方:

    test(1, "one") {
      // this is now your lambda1-function-body accepting a boolean...
      // here you now have three(+) ways to implement it...
    }
    
    lambda1车身的变型:

  • 忽略给定的布尔值:

    test(1, "one") { // _ -> // <- you can write this out explicitly if you like
      println("boolean value is ignored here")
    }
    
  • 方法参考:

    fun anythingThatConsumesABoolean(bool : Boolean) { }
    
    test(1, "one", ::anythingThatConsumesABoolean)
    


  • 如您所见:您不会从外部传递布尔值,而是在回调函数中处理它。

    您演示了如何使用
    t2
    -赋值调用
    test
    -函数。在
    test
    -实现中,您可能希望调用
    lambda1(yourBoolean)
    (或
    lambda1.invoke(yourBoolean)
    )。。。如何得到布尔值取决于你。。。在调用
    test
    时,您在编写
    //使用
    it
    做另一件事的部分中有了布尔值。。。如果愿意,您也可以命名该参数,例如,
    yourBool->println(“用$yourBool做点什么”)
    我已经编辑了我的问题,但仍然不知道如何传递布尔值。当我尝试调用test(1,“String”,true)时,我得到了一个错误:对于许多参数…您的错误不会是太多参数,而是“布尔文本不符合预期的类型((boolean)->Unit)”
    test
    的第三个参数是函数本身。。。不能只传递布尔值。布尔值应该在
    测试
    -函数中传递。。。至少这是我从签名中得到的;-)当您从外部调用
    test
    时,您必须使用回调函数来决定给定的布尔值会发生什么情况……您演示了如何使用
    t2
    -赋值调用
    test
    -函数。在
    test
    -实现中,您可能希望调用
    lambda1(yourBoolean)
    (或
    lambda1.invoke(yourBoolean)
    )。。。如何得到布尔值取决于你。。。在调用
    test
    时,您在编写
    //使用
    it
    做另一件事的部分中有了布尔值。。。如果愿意,您也可以命名该参数,例如,
    yourBool->println(“用$yourBool做点什么”)
    我已经编辑了我的问题,但仍然不知道如何传递布尔值。当我尝试调用test(1,“String”,true)时,我得到了一个错误:对于许多参数…您的错误不会是太多参数,而是“布尔文本不符合预期的类型((boolean)->Unit)”
    test
    的第三个参数是函数本身。。。不能只传递布尔值。布尔值应该在
    测试
    -函数中传递。。。至少这是我从签名中得到的;-)当你从外部调用
    test
    时,你必须使用回调函数来决定给定的布尔值会发生什么…当然,我倾向于避免使用
    it
    ,而更喜欢命名lambda参数,因为一旦你嵌套了lambda,它就会混淆你所指的
    it
    。我认为你的第二个代码片段是混淆的,并且基于一个错误的假设。为什么您(或任何人)要传递
    lambda1
    ,然后还要传递lambda将使用的arg?因为lambda1是一个函数指针,不知道将传递给它什么值。如果你在一个实例中提供{x->launchhielms(x)},而在另一个实例中提供{x->makeWorldPeace(x)},那就完全不同了。好吧,这有点让人困惑。我在第3个代码段中的示例阐明了不希望将lambda的参数传递到函数中的情况,因为该参数基于函数中发生的情况(而不是从外部源提供)。当然,我倾向于避免使用
    it
    ,而更喜欢命名lambda参数,因为一旦你嵌套了lambda,它就会混淆你所指的
    it
    。我认为你的第二个代码片段是混淆的,并且基于一个错误的假设。为什么您(或任何人)要传递
    lambda1
    ,然后还要传递lambda将使用的arg?因为lambda1是一个函数指针,不知道将传递给它什么值。如果你在一个实例中提供{x->launchhielms(x)},而在另一个实例中提供{x->makeWorldPeace(x)},那就完全不同了。好吧,这有点让人困惑。我在第3个代码段中的示例阐明了一种情况,即您不希望将lambda的参数传递到函数中,因为该参数基于w