在 Kotlin 中使用 lambda 的匿名 类
Anonymous classes with lambdas in 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);
}
}
我正在尝试将测试对象添加到 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 中删除 "internal" 对括号。现在你的代码 returns 不是 ArrayList<Int>()
,而是 returns 列表(调用时)
的函数
对于第二个问题:您在第一个问题中使用的技巧称为 SAM 转换并且 仅 用于 java 接口与 [=29= 一致]8。您的 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
。这里不需要它(我猜)并且它使代码复杂化了很多。
我正在尝试将我的休闲项目从 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 中删除 "internal" 对括号。现在你的代码 returns 不是 ArrayList<Int>()
,而是 returns 列表(调用时)
对于第二个问题:您在第一个问题中使用的技巧称为 SAM 转换并且 仅 用于 java 接口与 [=29= 一致]8。您的 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
。这里不需要它(我猜)并且它使代码复杂化了很多。