Sobes.tech
Middle

Mi történik, amikor lambda kifejezéseket használunk régi Android verziókon?

sobes.tech MI

Válasz az MI-től

Mikor használják a lambda kifejezéseket egy régebbi Android-verzióhoz (API 24 előtt) készült projektben, és fordítja le a Kotlin vagy Java (Java 8 lambda szintaxist használva) ezeket anonim osztályokká? Ez a folyamat automatikus, és build eszközökkel, például desugaring (Java esetén) vagy Kotlin bytecode generálással valósul meg.

A desugaring egy olyan folyamat, amely lehetővé teszi, hogy az új Java nyelvi funkciókat, például lambdákat, interfészekben alapértelmezett metódusokat, try-with-resources-t és másokat, régebbi Android-verziókon is használhassunk, ahol ezek a funkciók JVM szinten (Dalvik/ART) nem elérhetők. A build eszközök (például D8/R8) a forráskódból generált bytecode-ot átalakítják olyan bytecode-á, amely kompatibilis a cél Android-verzió futtatókörnyezetével.

A Kotlin esetében a fordító szintén átalakítja a lambdákat megfelelő bytecode reprezentációkra, gyakran anonim osztályokat használva. Régebbi Android-verziókra fordítva, ez a generált bytecode szintén kompatibilis a cél futtatókörnyezettel.

Így a kimeneti bytecode régebbi Android-verziókon is működik, de tartalmazhat extra osztályokat (egy anonim osztály minden lambda számára), ami kissé növelheti az APK méretét és a futási időt (az új objektumok létrehozása miatt).

// Java lambda példa
Runnable r = () -> System.out.println("Szia!");
 r.run();

A desugaring után ez nagyjából így alakítható bytecode-ra, amely ekvivalens:

// Desugaring eredményként emulált lambda
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Szia!");
    }
};
 r.run();

A Kotlin esetében a folyamat hasonló, a fordító szintén átalakítja a lambdákat ekvivalens formára.

// Kotlin lambda példa
val action = { println("Szia!") }
action.invoke()

Ez a kód szintén át fog alakulni olyan bytecode-ra, amely anonim osztályokat vagy ekvivalens szerkezeteket használ, kompatibilis a cél Android-verzióval.

Fontos megjegyezni, hogy a modern Android fejlesztői környezetekben (Android Studio, Gradle) a desugaring alapértelmezett, és a Kotlin vagy bizonyos Java verziókat használó projektek esetében aktiválva van. Ez teljesen átláthatóvá teszi a lambda-kifejezések és más új nyelvi funkciók használatát a fejlesztő számára, anélkül, hogy extra lépéseket kellene tenni a régebbi Android-verziók támogatásához.