创建一个返回每个内部对象的 lambda(如 forEach)
Posted
技术标签:
【中文标题】创建一个返回每个内部对象的 lambda(如 forEach)【英文标题】:Create a lambda that returns each internal object (like 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()
【问题讨论】:
【参考方案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,因为我遇到了一个令人困惑的错误。以上是关于创建一个返回每个内部对象的 lambda(如 forEach)的主要内容,如果未能解决你的问题,请参考以下文章