Rask Tips Skriv Cleaner Code Med Kotlin SAM Konverteringer

Hvis du er en erfaren Android-applikasjonsutvikler, er du sannsynligvis vant til Java-oversikten. Som et resultat kan du finne Kotlins konsise syntaks, som er rettet mot funksjonelle programmerere, litt foruroligende.

Et vanlig problem nybegynnere møter mens du lærer Kotlin, er å forstå hvordan det forventer at du skal jobbe med Java-grensesnitt som inneholder en enkelt metode. Slike grensesnitt er allestedsnærværende i Android-verdenen og kalles ofte SAM-grensesnitt, hvor SAM er kort for Single Abstract Method.

I denne korte opplæringen lærer du alt du trenger å vite for å kunne bruke Javas SAM-grensesnitt i Kotlin-koden.

1. Hva er en SAM-konvertering?

Når du vil bruke et Java-grensesnitt som inneholder en enkelt metode i Kotlin-koden, trenger du ikke manuelt å opprette en anonym klasse som implementerer den. I stedet kan du bruke et lambda-uttrykk. Takket være en prosess som kalles SAM-konvertering, kan Kotlin gjennomsiktig omdanne et lambda-uttrykk hvis signatur samsvarer med grensesnittets eneste metode i en forekomst av en anonym klasse som implementerer grensesnittet.

For eksempel, vurder følgende Java-grensesnitt med én metode:

offentlig grensesnitt adder offentlig tomt legg til (int a, int b); 

En naiv og Java 7-lignende tilnærming til å bruke det ovennevnte grensesnittet vil innebære å jobbe med en gjenstand uttrykk og vil se slik ut:

// Opprette forekomst av en anonym klasse // ved hjelp av objektet søkeord val adder = objekt: Adder overstyre morsomt tillegg (a: Int, b: Int): Int return a + b

Det er mye unødvendig kode, som heller ikke er veldig lesbar. Ved å utnytte Kotlins SAM-konverteringsfasilitet, kan du imidlertid skrive følgende tilsvarende kode i stedet:

// Opprette forekomst ved hjelp av en lambda val adder = Adder a, b -> a + b

Som du ser, har vi nå erstattet den anonyme klassen med et kort lambda-uttrykk, som er prefiks med navnet på grensesnittet. Merk at antallet argumenter som lambda-uttrykket tar, er lik antall parametere i signaturen til grensesnittets metode.

2. SAM-konverteringer i funksjonsanrop

Mens du arbeider med Java-klasser som har metoder som tar SAM-typer som deres argumenter, kan du forenkle ovenfor syntaksen ytterligere. For eksempel, vurder følgende Java-klasse, som inneholder en metode som forventer en objekt som implementerer Adder grensesnitt:

offentlig klasse kalkulator private adder adder; Offentlig tomt settAdder (Adder adder) this.adder = adder;  offentlig tomt legg til (int a, int b) Log.d ("CALCULATOR", "Sum er" + adder.add (a, b)); 

I Kotlin-koden kan du nå direkte sende et lambda-uttrykk til setAdder () metode uten å prefikse den med navnet på Adder grensesnitt.

val kalkulator = Kalkulator () kalkulator.setAdder (a, b -> a + b)

Det er verdt å merke seg at mens du ringer en metode som tar en SAM-type som eneste argument, er du fri til å hoppe over parentesen for å gjøre koden enda mer konsistent.

calculator.setAdder a, b -> a + b

3. SAM-konverteringer uten lambdas

Hvis du tror at lambda-uttrykkene er forvirrende, har jeg gode nyheter for deg: SAM-konverteringer fungerer også bra med vanlige funksjoner. For eksempel, vurder følgende funksjon hvis signatur samsvarer med den av Adder grensesnittets metode:

morsom myCustomAdd (a: Int, b: Int): Int = if (a + b < 100) -1 else if (a+b < 200) 0 else a+b

Kotlin lar deg passere direkte myCustomAdd () fungere som et argument til setAdder () metode av Kalkulator klasse. Ikke glem å referere til metoden ved hjelp av :: operatør. Dette er hvordan:

calculator.setAdder (dette :: myCustomAdd)

4. den variabel

Mange ganger inneholder SAM-grensesnitt en-parameter metoder. En enparametermetode, som navnet antyder, har bare en parameter i signaturen. Mens du arbeider med slike grensesnitt, tillater Kotlin deg å utelate parameteren i lambda-uttrykkets signatur og bruke en implisitt variabel som kalles den i uttrykkets kropp. For å gjøre ting klarere, bør du vurdere følgende Java-grensesnitt:

offentlige grensesnitt Doubler public int doubleIt (int nummer); 

Mens du bruker Dobbel grensesnitt i Kotlin-koden, trenger du ikke å nevne eksplisitt Nummer parameter i lambda-uttrykkets signatur. I stedet kan du bare referere til det som den.

// Dette lambda-uttrykket bruker det-variabelen val doubler1 = Doubler 2 * it // svarer til dette vanlige lambda-uttrykket val doubler2 = Doubler tall -> 2 * nummer

5. SAM-grensesnitt i Kotlin

Som Java-utvikler kan du være tilbøyelig til å lage SAM-grensesnitt i Kotlin. Å gjøre det er imidlertid vanligvis ikke en god ide. Hvis du lager et SAM-grensesnitt i Kotlin, eller oppretter en Kotlin-metode som forventer en objekt som implementerer et SAM-grensesnitt som et argument, vil SAM-konverteringsfasiliteten ikke være tilgjengelig for deg. SAM-konvertering er en Java-interoperabilitetsfunksjon og er begrenset til Java kun klasser og grensesnitt.

Fordi Kotlin støtter høyere rekkefølgefunksjoner-funksjoner som kan ta andre funksjoner som argumenter, trenger du aldri å lage SAM-grensesnitt i den. For eksempel, hvis Kalkulator Klassen er omskrevet i Kotlin, dens setAdder () Metoden kan skrives slik at den direkte tar en funksjon som argument, i stedet for et objekt som implementerer Adder grensesnitt.

klassen kalkulator var adder: (a: Int, b: Int) -> Int = a, b -> 0 // Standard implementering // Setter er tilgjengelig som standard morsomt tillegg (a: Int, b: Int)  Log.d ("CALCULATOR", "Sum er" + adder (a, b))

Mens du bruker den ovennevnte klassen, kan du angi huggorm til en funksjon eller et lambda-uttrykk ved hjelp av = operatør. Følgende kode viser deg hvordan:

valkalkulator = Kalkulator () calculator.adder = dette :: myCustomAdd // ELLER calculator.adder = a, b -> a + b

Konklusjon

Android APIs er i stor grad skrevet i Java, og mange bruker SAM-grensesnitt i stor utstrekning. Det samme kan sies om de fleste tredjepartsbiblioteker også. Ved å bruke teknikkene du lærte i denne opplæringen, kan du jobbe med dem i Kotlin-koden din på en kortfattet og lettlest måte.

Hvis du vil vite mer om Kotlins Java-interoperabilitetsfunksjoner, kan du se den offisielle dokumentasjonen. Og sjekk ut noen av våre andre opplæringsprogrammer på Android app utvikling!