Анонимные классы с лямбдами в Котлине

Я пытаюсь переписать проект досуга с Java на Kotlin (чтобы понять его), и я встретил некоторые проблемы. Исследования привели меня к { function() }, но это мне не помогло

В Java у меня есть этот интерфейс:

public interface Shuffling<t> {
 List<t> shuffle(List<t> list, ShuffleCallback callback);
 interface ShuffleCallback {
 void onShuffle(int addedTo, int randomIndex);
 }
}
</t></t></t>

И я пытаюсь добавить тестовый объект к списку алгоритмов перетасовки в Kotlin:

val algoList = ArrayList<shuffling<int>>()
algoList.add(Shuffling { list, callback -> {
 Timber.d("Test!")
 ArrayList<int>() // how to return this value?
}})
</int></shuffling<int>

Как добавить несколько строк в лямбда-функцию?

Также у меня есть еще один пример проблем:

Интерфейс Kotlin:

interface Drawable {
 fun draw()
}

И реализация Kotlin:

private val drawList = ArrayList<drawable>()
//...
drawList.add(Drawable {glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices)})
</drawable>

Раньше я использовал просто:

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

И все было в порядке.

1 ответ

ОК, так вот быстрые исправления:

Для вашего первого вопроса: пожалуйста, удалите "внутреннюю" пару скобок из вашей лямбды. Теперь ваш код возвращает не ArrayList<int>()</int>, а функцию, которая возвращает список (при вызове)

Для второго вопроса: трюк, который вы использовали в первом вопросе под названием SAM conversion, и работает только для интерфейсов 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 вам не нужно использовать Shuffling перед лямбдой. Это не нужно здесь (я думаю), и это очень усложняет код.

licensed under cc by-sa 3.0 with attribution.