Android 在Kotlin中传递并使用函数作为构造函数参数

Android 在Kotlin中传递并使用函数作为构造函数参数,android,kotlin,Android,Kotlin,如何创建将函数作为构造函数参数的类。然后,在类中稍后的某个点使用此函数。您可以拥有一个函数类型的属性,就像您拥有任何其他类型的属性一样: class A(val f: () -> Unit) { fun foo() { f() } } 从这里,您可以将该函数作为方法引用传递给构造函数: fun bar() { println("this is bar") } val a = A(::bar) a.foo() // th

如何创建将函数作为构造函数参数的类。然后,在类中稍后的某个点使用此函数。

您可以拥有一个函数类型的属性,就像您拥有任何其他类型的属性一样:

class A(val f: () -> Unit) {

    fun foo() {
        f()
    }

}
从这里,您可以将该函数作为方法引用传递给构造函数:

fun bar() {
    println("this is bar")
}

val a = A(::bar)
a.foo()             // this is bar
或者作为lambda:

val a = A({ println("this is the lambda") })
您甚至可以对lambda(函数的最后一个参数)执行常见的语法调整(尽管这有点疯狂):


如果有多个构造函数声明,则可以使用

...

private var listener : (() -> Unit)? = null

constructor(context: Context, listener: (() -> Unit)?) : this(context){
        this.listener = listener
}

constructor(context: Context) : super(context, attrs = null)

...

SynchronizedLazyImpl
中可以看到一个真实的例子,该类支持
lazy
委托

public fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T> = 
    SynchronizedLazyImpl(initializer, lock)
public-fun-lazy(锁:Any?,初始值设定项:()->T):lazy=
SynchronizedLazyImpl(初始化器,锁)
当我们通过lazy{…}使用
val x时,作为lambda传递的
初始值设定项
实际上存储为
SynchronizedLazyImpl
实例中的一个属性,并在以后第一次访问相应的
val x
时调用

public fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T> = 
    SynchronizedLazyImpl(initializer, lock)