Sobes.tech
Middle

Эски Android версияларында lambda билдирүүлөрүн колдонгондо эмне болот?

sobes.tech AI

AIден жооп

Көпчүлүк Android эскирүү версиялары үчүн (API 24 чейин) лямбда-экспрессияларды колдонуу учурунда Kotlin же Java компилятору (Java 8 лямбда синтаксисин колдонуу менен) аларды анонимдүү класстарга айлантат. Бул процесс автоматтык түрдө ишке ашып, desugaring (Java үчүн) же Kotlin байткодун генерациялоо аркылуу ишке ашырылат.

Desugaring — бул Java тилинин жаңы мүмкүнчүлүктөрүн, мисалы, лямбда, интерфейстердеги алдын ала аныкталган методдор, try-with-resources жана башка, эски Android версияларында колдонууга мүмкүндүк берүүчү процесс. Бул үчүн колдонулган инструменттер (мисалы, 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 версияларын колдоого кошумча кадамдар талап кылынбайт.