【问题标题】:using val in kotlin lambda在 kotlin lambda 中使用 val
【发布时间】:2021-04-18 08:38:35
【问题描述】:

我正在使用 kotlin 中的 map,目前我想看看是否可以将整数列表映射到函数列表 (Int) -> Int,同时在内部执行一堆操作需要我将值保存到 vals 的 lambda

所以我有这个简单的代码:

val num = arrayOf(1, 2, 3, 4)

  val funcs = num.map <Int, (Int) -> Int > { x  -> {
        y -> y + x
    }}

这是一个精简的例子,我真正想做的事情有点复杂。但是我需要在“内部”lambda 内部进行相当多的操作,所以我需要编写可以使用 val 的代码块。像这样:

val fs = num.map <Int, (Int) -> Int > { x  -> {
        y -> {
        val tmp = y *2
        val tmp1 = x / 2
        tmp + tmp1

        }
}}

但这部分不起作用,编译器被返回类型弄糊涂了 我该怎么做?

【问题讨论】:

  • 哪部分不起作用?
  • 为什么还需要中间变量? y -&gt; y * 2 + x / 2 怎么了?
  • 确切的例子是一个玩具例子。但实际上我只需要编写一些我们无法在单个 oneliner 中编写的代码
  • 您是否尝试过为 lambda 参数指定显式类型?
  • 另外,底部不工作

标签: kotlin functional-programming


【解决方案1】:

您的代码特别不起作用的原因是因为您在第二个示例中的y -&gt; 之后添加了一个额外的{

val fs = num.map<Int, (Int) -> Int> { x ->
    { y ->
        { // this is not needed
            val tmp = y * 2
            val tmp1 = x / 2
            tmp + tmp1
            
        }// this is not needed
    }
}

所以你正在创建一个 {} 的“块”,在 kotlin 中意味着你正在创建一个 lambda 函数。块在引号中的原因是因为如果你真的想要 kotlin 中的块,语法是 run {},而不是 java {}。但同样,您在这里不需要它。

您所要做的就是删除多余的括号,您的代码就可以了:

val fs = num.map <Int, (Int) -> Int > { x  -> {
        y ->
    val tmp = y *2
    val tmp1 = x / 2
    tmp + tmp1
}}

【讨论】:

    【解决方案2】:

    单行和多行lambda没有区别

    val fs = num.map { x ->
        { y: Int ->
            val tmp = y * 2
            val tmp1 = x / 2
            tmp + tmp1
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多