【问题标题】:Kotlin function that receives two numbers and returns sum and multiply of themKotlin 函数接收两个数字并返回它们的总和和相乘
【发布时间】:2018-05-02 17:21:27
【问题描述】:

我是 Kotlin lambda 表达式的新手,我尝试构建一个有两个参数的函数并返回一个带有 to 参数的函数:

val sumAndMultiply:(Int,Int) -> (Int,Int) -> Unit = { a,b -> (a+b,a*b)}

但它没有编译。 一般如何在 Kotlin 中返回无头函数?

【问题讨论】:

  • 即使不考虑语法错误,我也看不到您将传递给返回函数的函数的参数。我看到一个返回二进制函数的空函数。
  • @MarkoTopolnik 好的,请帮我创建一个有两个参数并返回一个有两个参数的函数。
  • 顺便说一句,什么是“无头函数”?您的意思是 val 持有 lambda 而不是常规函数声明?

标签: android lambda kotlin


【解决方案1】:

请帮我创建一个有两个参数的函数并返回一个有两个参数的函数。

这是一个接受两个参数并返回一个有两个参数的函数的函数。

fun binaryFunReturningBinaryFun(a: Int, b: Int): (Int, Int) -> Int =
        { x, y -> (a + x) * (b + y) }

【讨论】:

  • 正确的方式是什么?语法上?
  • 请添加一个如何使用 binaryFunReturningBinaryFun 的示例,并在此示例中打印和和乘法。谢谢
  • 我问过你好几次来解释你真正想要什么,但我得到的只是“帮我写一个带两个参数的函数,它返回一个带两个参数的函数”。这是我提供的。我仍然不知道你希望你的函数返回函数实际做什么。具体来说,正如我已经说过的,我看不出四个参数中的每一个应该扮演什么角色(两个到外部函数,两个到它返回的函数)。
  • :|其实我想用 lambda 函数替换 Listener 接口
  • 根据您目前的意见,我无法进一步帮助您。
【解决方案2】:

Kotlin 不支持 tuples。您必须使用 Pair:

val sumAndMultiply: ((Int,Int) -> Pair<Int,Int>) = { a,b -> Pair(a+b,a*b) }

另一种解决方案是创建数据类,例如:

data class SumAndMultiplication(val sum: Int, val multiplication: Int)
val sumAndMultiply2: ((Int,Int) -> SumAndMultiplication) = { a,b -> SumAndMultiplication(a+b,a*b) }

【讨论】:

    【解决方案3】:

    我用下面的代码做了同样的事情,它成功了。

    var rtn:(Int,Int) -> Unit = {x,y -> println("${x} ${y}")}
    val sumAndMultiply: (Int,Int) -> Any = { a,b -> rtn(a+b,a*b)}
    sumAndMultiply(1,3)
    

    说明

    你想从你的 lambda 函数中返回一个函数,所以首先你必须创建你想要返回的函数。所以,我为此创建了rtn 函数。我还创建了 rtn 作为 lambda 函数。您可以根据需要创建。

    然后我更改了 sumAndMultiply lambda 函数的返回类型和我们创建的返回函数 rtn

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多