inline-funktiot: lambda-kustannusten poistaminen
Merkitkää funktioita inline-määritteellä välttääksenne lambda-parametrien olioiden luomisen.
inline-funktiot: lambda-kustannusten poistaminen on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.
Mikä on inline-funktio?
Normaalisti funktiolle välitetty lambda käännetään anonyymiksi luokaksi. Jokainen kutsu varaa uuden olion, mikä kuluttaa muistia ja aikaa. inline-avainsana käskee kääntäjää kopioimaan funktion rungon ja sen lambda-argumentit suoraan kutsukohtaan.
inlinen määrittäminen
Lisätkää inline-määre ennen fun-avainsanaa:
inline fun measureTime(block: () -> Unit): Long {
val start = System.nanoTime()
block()
return System.nanoTime() - start
}Miten kääntäjä kirjoittaa kutsun uudelleen
Kutsu, kuten measureTime { doWork() }, muuttuu tavukooditasolla siten, että measureTime-funktion runko sijoitetaan kutsukohtaan — lambdaoliota ei varata lainkaan.
Milloin inlinea kannattaa käyttää
Käyttäkää inline-määrettä, kun:
- funktio ottaa yhden tai useita lambda-parametreja
- sitä kutsutaan usein suorituskyvyn kannalta kriittisissä kohdissa, kuten tiukoissa silmukoissa tai composable-funktioissa
- tarvitsette
reified-tyyppiparametreja, joita käsitellään seuraavaksi
Suorituskyvyn vertailuesimerkki
Ilman inline-määrettä jokainen korkeamman asteen funktion kutsu varaa lambdaolion. Sen kanssa JVM näkee suoraviivaista koodia — ei varauksia eikä virtuaalista lähetystä.
inline fun repeat(n: Int, block: () -> Unit) {
for (i in 0 until n) block()
}Epäpaikalliset paluut
Inline-funktioiden keskeinen hyöty on, että lambda voi käyttää return-lausetta poistuakseen ympäröivästä funktiosta, ei vain lambdasta. Tätä kutsutaan epäpaikalliseksi paluuksi.
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
}inlinen rajoitukset
Inline-funktioita ei voi tallentaa muuttujiin tai välittää olioina, koska niitä ei ole suorituksen aikana olemassa ensiluokkaisina entiteetteinä. Ette voi kutsua f(::measureTime), jos f odottaa kyseisen allekirjoituksen mukaista funktioviitettä.
Kokoelmaputkien inline-käsittely
Vakiokirjaston funktiot map, filter, forEach ja niin edelleen ovat kaikki inline-funktioita. Siksi niiden ketjuttaminen ei luo ylimääräisiä sulkeumaolioita jokaiselle alkiolle.
val result = (1..1_000_000)
.filter { it % 2 == 0 } // inline
.map { it * it } // inline
.take(10)Koodikoon kompromissi
Jokainen kutsukohta saa kopion inline-käsitellystä koodista. Jos funktion runko on suuri ja sitä kutsutaan monesta paikasta, tavukoodin koko kasvaa. Suosikaa inline-määrettä pienissä, usein kutsutuissa lambdoissa.
Yhteistoiminta companion- ja top-level-funktioiden kanssa
inline toimii ylätason funktioissa ja jäsenfunktioissa. Se ei toimi ominaisuuksissa tai rakentajissa. Funktion on oltava näkyvissä kutsukohdassa, yleensä public tai internal.
Vakiokirjaston esimerkkejä
Tunnet jo seuraavat inline-funktiot: let, run, apply, also, with, use, synchronized ja lazy (lohkovariantti). inline-määre tekee niiden lambdoista lisäkustannuksettomia.
Pikatarkistus
Mikä on korkeamman asteen funktion inline-määreellä merkitsemisen tärkein hyöty?
Kertaus: inline-funktiot
Tärkeimmät opit:
inlinepoistaa lambdaolion varauksen- mahdollistaa epäpaikalliset paluut lambdoista
- vaaditaan
reified-tyyppiparametreille - sopii parhaiten pienille, usein kutsutuille korkeamman asteen funktioille
- vakiokirjaston scope-funktiot ovat kaikki
inline-funktioita
Opi Kotlin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 51
- Oppitunnit
- 203
Usein kysytyt kysymykset
Onko oppitunti ”inline-funktiot: lambda-kustannusten poistaminen” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “inline-funktiot: lambda-kustannusten poistaminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”inline-funktiot: lambda-kustannusten poistaminen”?
Merkitkää funktioita inline-määritteellä välttääksenne lambda-parametrien olioiden luomisen. Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”inline-funktiot: lambda-kustannusten poistaminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?
Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- inline-funktiot: lambda-kustannusten poistaminen
- noinline- ja crossinline-määritteet
- reified-tyyppiparametrit: T:n käyttäminen ajon aikana
- Käytännön reified-mallit: jäsennys, DI ja serialisointi