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:
inlineeliminuje 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
- Funkcje inline: eliminowanie narzutu lambd
- Modyfikatory noinline i crossinline
- Parametry typów reified: dostęp do T w czasie działania
- Praktyczne wzorce reified: parsowanie, DI i serializacja