Kotlin中带有lambda的匿名类

安东·什库连科(Anton Shkurenko)

我试图将我的业余时间项目从Java重写为Kotlin(以了解它),但遇到了一些问题。研究把我带到了这里,{ function() }但没有帮助我

在Java中,我具有以下接口:

public interface Shuffling<T> {

  List<T> shuffle(List<T> list, ShuffleCallback callback);

  interface ShuffleCallback {
    void onShuffle(int addedTo, int randomIndex);
  }
}

我正在尝试将测试对象添加到Kotlin中的混洗算法列表中:

val algoList = ArrayList<Shuffling<Int>>()
algoList.add(Shuffling { list, callback -> {
    Timber.d("Test!")
    ArrayList<Int>() // how to return this value?
}})

第一次麻烦

如何在lambda函数中添加多行?

我也有麻烦的另一个例子:

Kotlin界面:

interface Drawable {
    fun draw()
}

和Kotlin的实现:

private val drawList = ArrayList<Drawable>()

//...
drawList.add(Drawable {glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)})

第二麻烦

以前我只是使用:

mDrawList.add(() -> glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices));

一切都很好。

沃丹

好,所以这里是快速修复:

第一个问题:请从您的lambda上删除“内部”括号。现在,您的代码未返回ArrayList<Int>(),而是返回了列表的函数(调用时)

对于第二个问题:在第一个问题中使用的技巧称为SAM转换,适用于与java8一致的java接口。Drawable是在Kotlin中定义的,因此没有可用的黑魔法,您必须创建一个实例并将其传递:

drawList.add(object: Drawable {
    override fun draw() = glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)
})

有关更多信息,请阅读:https : //kotlinlang.org/docs/reference/java-interop.html#sam-conversions

PS,您不必Shuffling在lambda之前使用。这里不需要(我猜),这使代码非常复杂。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章