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

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

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

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

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

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

Первая проблема

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

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

Интерфейс Kotlin:

 interface Drawable { fun draw() } 

И реализация Котлина:

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

Вторая проблема

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

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

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

Solutions Collecting From Web of "Анонимные классы с лямбдами в Котлине"

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

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

Второй вопрос: трюк, который вы использовали в своем первом вопросе, называемый преобразованием 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

PS вам не нужно использовать Shuffling перед лямбдой. Это не нужно здесь (я думаю), и это усложняет код.