【问题标题】:Anonymous classes with lambdas in KotlinKotlin 中带有 lambda 的匿名类
【发布时间】:2015-11-22 13:13:44
【问题描述】:

我正在尝试将我的休闲项目从 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));

一切都很好。

【问题讨论】:

    标签: java kotlin


    【解决方案1】:

    好的,下面是快速修复:

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

    对于第二个问题:您在第一个问题中使用的技巧称为 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。这里不需要它(我猜),它使代码复杂很多。

    【讨论】:

    • 我尝试创建 lambda 洗牌实例,只是为了测试 kotlin 中的 lambda 是如何工作的。
    • 1) 我可以添加多行吗?最后一行将返回值?但是如果我使用 if/else 怎么办? 2)如果我重写java的接口,我就可以使用lamdas了?或者如何用 Kotlin 做到这一点?我真的很喜欢不要写这个对象,覆盖等
    • 您想要我的不完整、简短的答案还是文档链接?
    • 呵呵,我想你的回答会更清楚。也是的,你的解决方案对我有用,但我仍然有这个问题
    • 另外,是否有必要“转换”为 Shuffle?我能以某种方式只使用花括号吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多