Какво се случва, когато използваме лямбда изрази на по-старите версии на 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.