0Pricing
Kotlin Academy · Lekcja

Funkcje inline: eliminowanie narzutu lambd

Oznaczaj funkcje jako inline, aby uniknąć tworzenia obiektów dla parametrów lambda.

Funkcje inline: eliminowanie narzutu lambd to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Czym jest funkcja inline?

Zwykle lambda przekazana do funkcji jest kompilowana do klasy anonimowej. Każde wywołanie alokuje nowy obiekt, co kosztuje pamięć i czas. Słowo kluczowe inline mówi kompilatorowi, aby skopiował treść funkcji oraz jej argumenty lambda bezpośrednio w miejsce wywołania.

Deklarowanie inline

Dodaj modyfikator inline przed fun:

inline fun measureTime(block: () -> Unit): Long {
    val start = System.nanoTime()
    block()
    return System.nanoTime() - start
}

Jak kompilator przepisuje wywołanie

Wywołanie takie jak measureTime { doWork() } staje się na poziomie bajtkodu treścią funkcji measureTime wstawioną w miejsce wywołania — obiekt lambda nigdy nie jest alokowany.

Kiedy używać inline

Używaj inline, gdy:

  • funkcja przyjmuje co najmniej jeden parametr lambda
  • jest często wywoływana w miejscach o wysokiej częstotliwości wykonywania, takich jak ścisłe pętle lub funkcje composable
  • potrzebujesz parametrów typu reified (omówionych w następnej części)

Przykład testu wydajności

Bez inline każde wywołanie funkcji wyższego rzędu alokuje obiekt lambda. Z inline maszyna JVM widzi kod wykonywany liniowo — bez alokacji i bez wirtualnego wywołania.

inline fun repeat(n: Int, block: () -> Unit) {
    for (i in 0 until n) block()
}

Nielokalne instrukcje return

Kluczowa zaleta funkcji inline: lambda może użyć return, aby wyjść z otaczającej funkcji, a nie tylko z lambdy. Nazywa się to nielokalnym powrotem.

inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
    for (item in list) block(item)
}

fun findFirst(list: List<Int>): Int {
    forEach(list) { if (it > 5) return it }  // returns from findFirst
    return -1
}

Ograniczenia inline

Funkcji inline nie można przechowywać w zmiennych ani przekazywać jako obiektów, ponieważ w czasie wykonywania nie istnieją jako encje pierwszej klasy. Nie można wywołać f(::measureTime), gdy f oczekuje odwołania do funkcji o takim podpisie.

Inlining potoków kolekcji

Funkcje biblioteki standardowej, takie jak map, filter i forEach, są wszystkie inline. Dzięki temu ich łączenie nie tworzy dodatkowych obiektów domknięć dla każdego elementu.

val result = (1..1_000_000)
    .filter { it % 2 == 0 }   // inline
    .map { it * it }           // inline
    .take(10)

Kompromis dotyczący rozmiaru kodu

Każde miejsce wywołania otrzymuje kopię kodu wstawionego przez kompilator. Jeśli treść funkcji jest duża i funkcja jest wywoływana w wielu miejscach, rozmiar bajtkodu rośnie. Preferuj inline dla małych, często wywoływanych lambd.

Współpraca z companion i funkcjami najwyższego poziomu

inline działa dla funkcji najwyższego poziomu i funkcji składowych. Nie działa dla właściwości ani konstruktorów. Funkcja musi być widoczna w miejscu wywołania, zwykle jako public lub internal.

Przykłady z biblioteki standardowej

Funkcje oznaczone inline, które już znasz: let, run, apply, also, with, use, synchronized oraz lazy (wariant blokowy). To modyfikator inline sprawia, że ich lambdy nie generują dodatkowego kosztu.

Szybkie sprawdzenie

Jaka jest główna korzyść z oznaczenia funkcji wyższego rzędu jako inline?

Podsumowanie: funkcje inline

Najważniejsze wnioski:

  • inline eliminuje alokowanie obiektów lambda
  • umożliwia nielokalne powroty z lambd
  • jest wymagane dla parametrów typu reified
  • najlepiej sprawdza się w małych, często wywoływanych funkcjach wyższego rzędu
  • funkcje zakresowe biblioteki standardowej są oznaczone jako inline

Często zadawane pytania

Czy lekcja „Funkcje inline: eliminowanie narzutu lambd” jest bezpłatna?

Tak — pełny tekst „Funkcje inline: eliminowanie narzutu lambd” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Funkcje inline: eliminowanie narzutu lambd”?

Oznaczaj funkcje jako inline, aby uniknąć tworzenia obiektów dla parametrów lambda. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Funkcje inline: eliminowanie narzutu lambd”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje inline: eliminowanie narzutu lambd
  2. Modyfikatory noinline i crossinline
  3. Parametry typów reified: dostęp do T w czasie działania
  4. Praktyczne wzorce reified: parsowanie, DI i serializacja
← Powrót do Kotlin Academy