Intereting Posts
Функция аннотирования интерфейса, которая должна вызывать супер Котлин, когда делегировать карту? gradle multi-project: каталог сборки появляется в корневом каталоге, содержащем артефакты Котлина Gradle compileKotlin includeRuntime, не добавляя время выполнения в jar названные функции против лямбда-рефлексии Как liveata отправляет данные в действие, если какие-либо изменения Kotlin: использование статических методов google-guava в качестве расширений Как правильно реализовать lateinit с пользовательскими объектами класса для использования в onCreate () в android, избегая ошибки Property getter или setter expected Где intelliJ помещает kotlin.js в Мультиплатформенный проект Разбор JSON с использованием Klaxon с doAsync от Anko не выполняется Интерфейс фабрики Kotlin с дженериками Невозможно создать прослушиватель событий Spring Data в Котлине Как Kotlin возьмет val как ключевое слово из класса java Не удалось настроить обновление плагина kotlin? Как настроить пользовательский шрифт для приложения для Android?

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

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