Sobes.tech
Middle

Какво се случва, когато използваме лямбда изрази на по-старите версии на Android?

sobes.tech AI

Отговор от AI

Кога се използват лямбда изрази в проект за по-стари версии на Android (преди API 24), и дали компилаторът Kotlin или Java (при използване на синтаксис на лямбда от Java 8) ги преобразува в анонимни класове? Този процес е автоматичен и се извършва с помощта на инструменти за изграждане като desugaring (за Java) или генериране на байткод в Kotlin.

Desugaring е процес, който позволява използването на нови функции на езика Java, като лямбда, методи по подразбиране в интерфейси, try-with-resources и други, на по-стари версии на Android, където тези функции не са налични на JVM ниво (Dalvik/ART). Инструментите за изграждане (например D8/R8) трансформират генерирания байткод от изходния код, който използва тези нови езикови функции, в байткод, съвместим с изпълнителната среда на целевата версия на Android.

За Kotlin, компилаторът също преобразува лямбда изразите в съответните представяния на байткод, често използвайки анонимни класове. При компилиране за по-стари версии на Android, този генериран байткод също е съвместим с целевата среда.

Така, полученият байткод работи на по-стари версии на Android, но може да съдържа допълнителни класове (един анонимен клас за всяка лямбда), което може леко да увеличи размера на APK и времето за изпълнение (заради създаването на нови обекти).

// Пример на лямбда в Java
Runnable r = () -> System.out.println("Здравей!");
 r.run();

След desugaring, това може да бъде преобразувано приблизително в следния байткод, който е еквивалентен:

// Емулиран резултат от desugaring за лямбда
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Здравей!");
    }
};
 r.run();

За Kotlin процесът е подобен, компилаторът също преобразува лямбда изразите в еквивалентна форма.

// Пример на лямбда в Kotlin
val action = { println("Здравей!") }
action.invoke()

Този код също ще бъде преобразуван в байткод, който използва анонимни класове или еквивалентни конструкции, съвместими с целевата версия на Android.

Важно е да се отбележи, че в съвременните среди за разработка на Android (Android Studio, Gradle), desugaring е активиран по подразбиране за повечето проекти, използващи Kotlin или определени версии на Java. Това прави използването на лямбда изрази и други нови възможности на езика напълно прозрачни за разработчика, без необходимост от допълнителни стъпки за поддръжка на по-стари версии на Android.