Могу ли я использовать лямбда-выражение Java в Котлине?

Я пришел из java, я привык к лямбдам java, сейчас я работаю в проекте kotlin и вижу, что есть другие виды лямбд, так как я предпочитаю синтаксис java (я также читал, что они лучше по производительности)

Can I still use java lambdas in kotlin?

Я пытаюсь сделать это, но он не компилируется:

Могу ли я использовать лямбда-выражение Java в Котлине?

Нет, ты не можешь. Котлин — это не Java.

Sweeper 16.05.2022 14:12

kotlin должен быть на 100% совместим с Java, похоже, между ними есть некоторые различия

David Marciel 16.05.2022 14:16

kotlin имеет собственную лямбда-методологию. kotlinlang.org/docs/lambdas.html

Tschallacka 16.05.2022 14:16

Что вы можете. Просто напишите свою лямбду в файле .java, а затем сделайте ссылку на нее из Kotlin. (если это было неочевидно, не делайте этого на самом деле)

Jorn 16.05.2022 14:16

Круто, как говорит Йорн, я все еще могу использовать его в файлах .java, и они на 100% совместимы, спасибо!

David Marciel 16.05.2022 14:17

Я надеюсь, что кто-то просмотрит этот код

Jorn 16.05.2022 14:18

«100% совместимость с Java» не означает, что вы можете использовать синтаксис Java при программировании на Kotlin. Это означает, что код Kotlin может взаимодействовать с кодом Java, поэтому вы можете без проблем вызывать код, написанный на Java (в исходном файле Java, скомпилированном с помощью компилятора Java).

Jesper 16.05.2022 14:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Синтаксически нет. В Котлине вы можете писать лямбды только по-котлински, т.е.

{ p1, p2, p3 -> ... }

Это не означает, что вы не можете передавать лямбда-выражения Kotlin в API Java, принимающие функциональный интерфейс. Это вполне возможно.

В конце концов, Kotlin и Java — это два разных языка с разным синтаксисом.

// Stream.map is a Java API, but it can take a "Kotlin lambda" just fine
ids.stream().map { anId -> anId + 1 } 

Однако, поскольку вы упомянули, что лямбда-выражения Java «лучше по производительности» (при условии, что вы имеете в виду, что они скомпилированы для вызовов invokedynamic), следует отметить, что лямбда-выражения Kotlin также делают это, начиная с Kotlin 1.5, при определенных обстоятельствах, как обсуждалось здесь:

Kotlin 1.5.0 now uses dynamic invocations (invokedynamic) for compiling SAM (Single Abstract Method) conversions:

  • Over any expression if the SAM type is a Java interface
  • Over lambda if the SAM type is a Kotlin functional interface

Таким образом, приведенный выше вызов Stream.map будет скомпилирован с использованием invokedynamic, как и лямбда-выражение Java, потому что это преобразование в интерфейс Java java.util.function.Function. С другой стороны, обычная лямбда Kotlin будет скомпилирована в анонимный внутренний класс.

Другие вопросы по теме