Sobes.tech
Middle

Kas notiek, kad mēs izmantojam lambda izteiksmes vecākās Android versijās?

sobes.tech AI

Atbilde no AI

Kad projektā vecākām Android versijām (pirms API 24) tiek izmantotas lambda izteiksmes, Kotlin vai Java kompilators (izmantojot Java 8 lambda sintaksi) tās pārvērš par anonīmām klasēm. Šis process ir automatizēts un tiek veikts ar būvniecības rīkiem, piemēram, desugaring (Java) vai bytecode ģenerēšanu Kotlin.

Desugaring ir process, kas ļauj izmantot jaunas Java valodas iespējas, piemēram, lambda, noklusējuma metodes interfeisos, try-with-resources un citas, vecākās Android versijās, kur šīs iespējas sākotnēji nav pieejamas JVM līmenī (Dalvik/ART). Būvniecības rīki (piemēram, D8/R8) pārveido ģenerēto bytecode no jauno valodas iespēju avota koda uz bytecode, kas ir saderīgs ar mērķa Android versijas izpildes vidi.

Kotlin kompilators arī pārvērš lambda uz atbilstošām bytecode reprezentācijām, bieži izmantojot anonīmas klases. Kompilējot vecākām Android versijām, šis ģenerētais bytecode ir arī saderīgs ar izpildes vidi.

Tādējādi, gala rezultātā iegūstam bytecode, kas darbojas vecākās Android versijās, bet var saturēt papildu klases (vienu anonīmu klasi katrai lambda), kas var nedaudz palielināt APK izmēru un izpildes laiku (dēļ jaunu objektu izveides).

// Lambda piemērs Java
Runnable r = () -> System.out.println("Sveiki!");
 r.run();

Pēc desugaring tas var tikt pārveidots līdz šādam bytecode, kas ir ekvivalents:

// Desugaring emulēts rezultāts lambda
Runnable r = jauns Runnable() {
    @Override
    public void run() {
        System.out.println("Sveiki!");
    }
};
r.run();

Kotlin procesā tas ir līdzīgi, kompilators pārvērš lambda uz ekvivalentu formu.

// Kotlin lambda piemērs
val action = { println("Sveiki!") }
action.invoke()

Šis kods arī tiks pārveidots uz bytecode, kas izmanto anonīmas klases vai ekvivalentas konstrukcijas, saderīgas ar mērķa Android versiju.

Svarīgi atzīmēt, ka mūsdienu Android izstrādes vidēs (Android Studio, Gradle) desugaring ir aktivizēts pēc noklusējuma lielākajai daļai projektu, kas izmanto Kotlin vai noteiktas Java versijas. Tas padara lambda un citas jaunas valodas iespējas pilnīgi skaidras izstrādātājam, neprasot papildu soļus vecāku Android versiju atbalstam.