在Kotlin中使用lambdas的匿名类

Ant*_*nko 8 java kotlin

我正在尝试将我的休闲时间项目从Java重新编写到Kotlin(理解它),我遇到了一些问题.研究给我带来了{ function() }但它并没有帮助我

在Java中我有这个界面:

public interface Shuffling<T> {

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

  interface ShuffleCallback {
    void onShuffle(int addedTo, int randomIndex);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

第一个麻烦

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

另外我还有一个麻烦的例子:

Kotlin界面:

interface Drawable {
    fun draw()
}
Run Code Online (Sandbox Code Playgroud)

和Kotlin实施:

private val drawList = ArrayList<Drawable>()

//...
drawList.add(Drawable {glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)})
Run Code Online (Sandbox Code Playgroud)

第二个麻烦

以前我只用过:

mDrawList.add(() -> glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices));
Run Code Online (Sandbox Code Playgroud)

一切都很好.

vod*_*dan 9

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

对于您的第一个问题:请从lambda中删除"内部"对括号.现在你的代码没有返回ArrayList<Int>(),但返回列表的函数(调用时)

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

drawList.add(object: Drawable {
    override fun draw() = glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)
})
Run Code Online (Sandbox Code Playgroud)

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

PS你不必Shuffling在lambda之前使用.这里不需要它(我猜)并且它使代码复杂化很多.