Sobes.tech
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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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)?) { ... }
    }
}