Я пришел из java, я привык к лямбдам java, сейчас я работаю в проекте kotlin и вижу, что есть другие виды лямбд, так как я предпочитаю синтаксис java (я также читал, что они лучше по производительности)
Can I still use java lambdas in kotlin?
Я пытаюсь сделать это, но он не компилируется:
kotlin должен быть на 100% совместим с Java, похоже, между ними есть некоторые различия
kotlin имеет собственную лямбда-методологию. kotlinlang.org/docs/lambdas.html
Что вы можете. Просто напишите свою лямбду в файле .java, а затем сделайте ссылку на нее из Kotlin. (если это было неочевидно, не делайте этого на самом деле)
Круто, как говорит Йорн, я все еще могу использовать его в файлах .java, и они на 100% совместимы, спасибо!
Я надеюсь, что кто-то просмотрит этот код
«100% совместимость с Java» не означает, что вы можете использовать синтаксис Java при программировании на Kotlin. Это означает, что код Kotlin может взаимодействовать с кодом Java, поэтому вы можете без проблем вызывать код, написанный на Java (в исходном файле Java, скомпилированном с помощью компилятора Java).
Синтаксически нет. В Котлине вы можете писать лямбды только по-котлински, т.е.
{ 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 будет скомпилирована в анонимный внутренний класс.
Нет, ты не можешь. Котлин — это не Java.