我试图将我的休闲时间项目从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));
一切都很好。
答案 0 :(得分:8)
好的,所以这里有快速解决方法:
关于你的第一个问题:请从你的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
P.S你不必在lambda之前使用Shuffling
。这里不需要它(我猜)并且它使代码复杂化了很多。