【问题标题】:Create a lambda that returns each internal object (like forEach)创建一个返回每个内部对象的 lambda(如 forEach)
【发布时间】:2021-11-22 11:11:45
【问题描述】:

如何创建自己的类似于 forEach (kotlin-stdlib) 的 lambda 表达式?

场景:

对于列表的每个对象,我将其包装在另一个对象中并调用如下包装器方法:

class Action {
  fun runA() {
    objects.forEach { obj ->
      val wrapper = Wrapper(obj)
      wrapper.runA()
    }
  }
}

问题:

我想在不重复代码的情况下创建runB。 如何在 Kotlin 中优雅地做到这一点?

我无法传递像下面这样的参数方法,因为我要调用的方法属于我尚未创建的实例。

class Action {

  fun runMethod(method: () -> Unit) {
    objects.forEach { obj ->
      val wrapper = Wrapper(obj)
      method() // I want: wrapper.method(), but wrapper is created in the forEach lambda
    }
  }

  fun runA() { ... }
  fun runB() { ... }
}

理想情况下,我想要这样的东西:

class Action {
// ...
fun runA() {
  runMethod { wrapper ->
    wrapper->runA()
  }
}

fun runB() {
  runMethod { wrapper ->
    wrapper->runB()
  }
}
}

【问题讨论】:

    标签: kotlin generics lambda


    【解决方案1】:

    如果我正确理解您的问题,您可以将接收器添加到传递给runMethod() 函数的 lambda。在传递的 lambda 中,Wrapper 变成 this

    fun main() {
        runMethod { runA() }
        runMethod { runB() }
        
        // or:
        
        runMethod(Wrapper::runA)
        runMethod(Wrapper::runB)
    }
    
    fun runMethod(method: Wrapper.() -> Unit) {
        objects.forEach { obj ->
            val wrapper = Wrapper(obj)
            wrapper.method()
        }
    }
    

    【讨论】:

    • 就是这样。我想我必须以某种方式返回 Wrapper 对象,然后命名它并在传递的 lambda 中使用它。
    • BTW 更新了我的上一个代码 sn-p,因为我遇到了一个令人困惑的错误。
    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2020-10-08
    • 2018-09-18
    • 1970-01-01
    • 2017-12-11
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多