在Kotlin的匿名类与lambdas

我正在尝试将我的闲暇时间项目从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转换的技巧, 适用于java接口以与java8保持一致。 你的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你不必在lambda之前使用Shuffling 。 这是不需要的(我猜),它使代码复杂化了很多。