在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
。 这是不需要的(我猜),它使代码复杂化了很多。