java - Kotlin 中带有 lambda 的匿名类

标签 java kotlin

我正在尝试将我的休闲项目从 Java 重写为 Kotlin(以理解它),但遇到了一些问题。研究把我带到了 { function() } 但它没有帮助我

在 Java 中我有这个接口(interface):

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?
}})

First trouble

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

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

Kotlin 界面:

interface Drawable {
    fun draw()
}

和 Kotlin 实现:

private val drawList = ArrayList<Drawable>()

//...
drawList.add(Drawable {glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)})

Second trouble

以前我只用过:

mDrawList.add(() -> glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices));

一切都很好。

最佳答案

好的,下面是快速修复:

对于您的第一个问题:请从您的 lambda 中删除“内部”括号对。现在您的代码返回不是 ArrayList<Int>() ,而是一个返回列表的函数(调用时)

对于第二个问题:您在第一个问题中使用的技巧称为 SAM 转换,适用于 java 接口(interface)以与 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 你不必使用 Shuffling在 lambda 之前。这里不需要它(我猜),它会使代码复杂很多。

关于java - Kotlin 中带有 lambda 的匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33855154/

相关文章:

java - 在单元测试中访问私有(private)静态最终值的最佳实践

java - 如何在 Java 中引用 Kotlin 对象类型?

java - 如何处理几十个不同的 JSON 响应?

java 将整数字符串转换为可能的 ASCII 字符组合

java - JOptionPane.showInputDialog显示两次,为什么?

java - (初学者 Java 问题)为什么这段代码不起作用?

jackson - jackson 未能反序列化Kotlin数据类

android-studio - Android Studio 3.2 Canary 2 Kotlin 运行时验证错误 : Rejecting class

templates - 在 Pebble 模板引擎中解析字符串模板而不是文件

android - 如何解决: Bundle' is deprecated.使用Android KTX版本?