创建一个返回每个内部对象的 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)的主要内容,如果未能解决你的问题,请参考以下文章

为什么匿名内部类可以实例化并实现抽象方法?lambda表达式是简化了匿名内部类的实现过程吗?

Java | 函数式接口与Lambda表达式之间微妙的关系

Java 关于函数式接口与Lambda表达式之间的关系

匿名内部类-Lambda表达式

java Lambda表达式

C++ lambda表达式(函数指针和function)