【问题标题】:Kotlin lambda with several parameters带有多个参数的 Kotlin lambda
【发布时间】:2017-11-02 11:51:43
【问题描述】:

我对 kotlin lambda 表达式有点困惑。 找不到合适的答案。

在 Java 中,我可以使用以下参数设置侦听器:

myObject.setListener(new MyListener() {
            @Override
            public boolean doSmth(int pos, int value) {
             switch(..) {
             ....
             }
            }
})

使用 lambda:

 myObject.setListener((p1, p2) -> {
   switch(..) {
    ....
   }
})

在 Kotlin 中我可以这样做:

myObject.setListener{p1, p2 -> return@setListener false}

myObject.setListener{{p1, p2 -> 
            if (p1) {
                return@setListener true
            } else {
                return@setListener false
            }
        }}

但它真的很丑。有什么方法可以更轻松吗? 我可以这样使用:

myObject.setListener{p1, p2 -> myFunc(p1, p2)}

但是如果我想把我的逻辑放到那个监听器中(它可能很复杂,不仅仅是if else return

【问题讨论】:

  • 你说丑,但和什么比呢?你的 java 版本是空的,所以它当然更干净......你能指定问题吗?

标签: java android lambda kotlin


【解决方案1】:

在您的第一个示例中,只需删除 return@setListener

myObject.setListener{p1, p2 -> false}

在你的第二个例子中,你必须小心:

  1. 你有一对花括号太多setListener{{必须是setListener{。否则,您将在 lambda 中创建一个 lambda。
  2. 您再次删除return。这是一个表达式主体,其中只使用了结果参数。

     myObject.setListener{p1, p2 -> 
        if (p1) {
            true
        } else {
            false
        }
    }
    

【讨论】:

    【解决方案2】:

    如果我理解正确,你有这样的事情:

    fun setListener(f: (Int, Int) -> Boolean) {
        f(1, 2)
    }
    
    setListener { p1, p2 -> true }
    

    当然你可以像这样将逻辑提取到另一个函数中:

    fun logic (i: Int, i2: Int) :Boolean {
        //complex stuff
        return true
    }
    setListener(::logic)
    

    【讨论】:

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