在Kotlin中遍历lambdas

时间:2018-10-24 10:39:29

标签: lambda foreach kotlin

我的MVP演示者已绑定到onResume中的视图,因此可以确保解除绑定。这意味着有时,例如,当数据来自onActivityResult()时,视图未绑定,但我们仍想触摸视图以显示进度等。到目前为止,我为此使用了一个标志并在bindView()或在updateView()中,绑定视图时将调用它。

现在我正在使用Kotlin,所以我想如果要在BasePresenter中为此使用lambda列表呢?这是我到目前为止的内容:

typealias AnyLambda = () -> Unit
private val deferredActions = mutableListOf<AnyLambda>()

private val funShowProgress : () -> Unit = {
   view()?.showProgress() }

override fun updateView() {
   deferredActions.forEach { anyLambda ->
      anyLambda()
      deferredActions.remove(anyLambda)
   }
}

fun onSomethingFromActivity(x: List<Y>) {
    ...
    deferredActions.add { funShowProgress }
}

问题在于lambda没有在forEach中调用。如果我在lambda中添加funShowProgress(),则可以正常工作。另外,lambda也在那里,因为它在forEach内部恰好运行一次,但是没有调用view.showProgress()。我对lambda有什么误解?

请注意,虽然我可以直接从视图中调用showProgress(),但我想避免这种情况。

2 个答案:

答案 0 :(得分:4)

您的ImageBuilder.Current.Build(new ImageJob(image, outputStream2, instructions2));调用是错误的:它添加了一个lambda来计算add表达式而没有任何结果(它不调用lambda)。使用以下任一方法:

funShowProgress

或者简单地

add { funShowProgress() }

答案 1 :(得分:1)

要扩展yole的答案,如果您定义如下函数,也可以使用add(::funShowProgressAsFunction )添加函数引用:

private val funShowProgressAsFunction : Unit =
   view()?.showProgress()