Middle+
Jaká jsou nebezpečí při přenosu lambda z Java do metody v Kotlinu?
sobes.tech AI
Odpověď od AI
Při předávání lambda z Java do metody v Kotlinu:
- SAM konverze: Lambda v Java musí odpovídat funkčnímu rozhraní (rozhraní s jednou abstraktní metodou), aby došlo k automatické konverzi na funkční typ v Kotlinu. Pokud lambda neodpovídá tomuto rozhraní, automatická konverze se neprovede a bude třeba ruční úprava nebo obal.
- Nullable typ: Funkční typ v Kotlinu získaný z Java není ve výchozím nastavení nullable (
() -> Unit). Pokud metoda v Kotlinu očekává nullable typ (() -> Unit)?), může být nutné explicitně uvést nullable typ při volání z Java. - Výjimky: Výjimky, které může kód uvnitř lambda v Java vyvolat, nejsou automaticky zpracovány v Kotlinu. Kotlinový kód musí tyto výjimky explicitně ošetřit pomocí
try-catch. - Výkon: Ačkoliv SAM konverze je obvykle efektivní, v některých případech může nadměrné vytváření wrapper objektů pro lambdy mírně ovlivnit výkon.
- Kompatibilita verzí: Funkce interakce mezi Kotlinem a Javou se mohou měnit mezi verzemi kompilátorů, což může vyžadovat pozornost při aktualizacích.
Příklad:
// Java kód
interface MyFunctionalInterface {
void doSomething();
}
class JavaConsumer {
public void consume(MyFunctionalInterface callback) {
callback.doSomething();
}
}
// Kotlin kód
class KotlinUser {
fun useConsumer(consumer: JavaConsumer) {
// Automatická SAM konverze z Java lambda na Kotlin funkční typ
consumer.consume { println("Dělám něco v Kotlinu") }
// Příklad, kde může být potřeba nullable typ v Kotlin funkci,
// pokud Java metoda může přijímat null
// fun consumeNullable(callback: (() -> Unit)?) { ... }
}
}