Dacă sunteți un dezvoltator experimentat de aplicații Android, probabil că sunteți obișnuiți cu verbozitatea Java 7. Ca rezultat, puteți găsi sintaxa concisă a lui Kotlin, care este orientată spre programatori funcționali, ușor tulburător.
O problemă comună întâlnită de începători în timpul învățării lui Kotlin este înțelegerea modului în care se așteaptă să lucrați cu interfețe Java care conțin o singură metodă. Astfel de interfețe sunt omniprezente în lumea Android și sunt adesea denumite interfețe SAM, unde SAM este scurt pentru metoda unică abstractă.
În acest tutorial scurt, veți afla tot ce trebuie să știți pentru a utiliza în mod adecvat interfețele Java SAM în codul Kotlin.
Când doriți să utilizați o interfață Java care conține o singură metodă în codul dvs. Kotlin, nu este necesar să creați manual o clasă anonimă care să o implementeze. În schimb, puteți utiliza o expresie lambda. Datorită unui proces numit conversie SAM, Kotlin poate converti în mod transparent orice expresie lambda a cărei semnătură se potrivește cu cea a metodei interfeței într-o instanță a unei clase anonime care implementează interfața.
De exemplu, ia în considerare următoarea interfață Java cu o singură metodă:
interfața publică Adder public void add (int a, int b);
O abordare naivă și Java 7 la utilizarea interfeței de mai sus ar implica lucrul cu un obiect
și ar arăta astfel:
// Crearea unei instanțe a unei clase anonime // utilizând cuvântul cheie obiect val adder = obiect: Adder suprascrie fun add (a: Int, b: Int): Int return a + b
Acesta este un cod inutil, care, de asemenea, nu este foarte lizibil. Prin folosirea facilității de conversie SAM de la Kotlin, cu toate acestea, puteți scrie următorul cod echivalent:
// Crearea instanței folosind un adder lambda val = Adder a, b -> a + b
După cum puteți vedea, acum am înlocuit clasa anonimă cu o expresie lambda scurtă, care este prefixată cu numele interfeței. Rețineți că numărul de argumente pe care le ia expresia lambda este egal cu numărul de parametri din semnătura metodei interfeței.
În timp ce lucrați cu clase Java având metode care iau ca argumente argumentele SAM, puteți simplifica mai departe sintaxa de mai sus. De exemplu, ia în considerare următoarea clasă Java, care conține o metodă care așteaptă ca un obiect să implementeze Sumator
interfaţă:
clasa publica publica Calculator adder adder privat; public void setAdder (adderul adder) this.adder = adder; public void add (int a, int b) Log.d ("CALCULATOR", "Suma este" + adder.add (a, b));
În codul dvs. Kotlin, acum puteți trece direct o expresie lambda la setAdder ()
, fără a prefixa cu numele Sumator
interfață.
calculatorul val = Calculator () calculator.setAdder (a, b -> a + b)
Este demn de remarcat faptul că în timp ce apelați o metodă care ia un tip SAM ca singurul său argument, sunteți liber să săriți paranteza pentru a vă face codul și mai concis.
calculator.setAdder a, b -> a + b
Dacă credeți că expresiile lambda sunt confuze, am veste bună pentru dvs.: conversiile SAM funcționează foarte bine și cu funcții obișnuite. De exemplu, luați în considerare următoarea funcție a cărei semnătură se potrivește cu cea a funcției Sumator
metoda interfeței:
distracție myCustomAdd (a: Int, b: Int): Int = dacă (a + b < 100) -1 else if (a+b < 200) 0 else a+b
Kotlin vă permite să treceți direct myCustomAdd ()
funcția ca argument pentru setAdder ()
metodă a Calculator
clasă. Nu uitați să menționați metoda folosind ::
operator. Iată cum:
calculator.setAdder (acest :: myCustomAdd)
aceasta
VariabilDe multe ori, interfețele SAM conțin metode cu un parametru. O metodă cu un parametru, așa cum sugerează și numele său, are doar un singur parametru în semnătura sa. În timp ce lucrați cu astfel de interfețe, Kotlin vă permite să omiteți parametrul din semnătura expresiei lambda și să folosiți o variabilă implicită numită aceasta
în corpul expresiei. Pentru a face lucrurile mai clare, luați în considerare următoarea interfață Java:
interfața publică Doubler public int doubleIt (număr int);
În timpul utilizării doubler
interfață în codul dvs. Kotlin, nu trebuie să menționați explicit număr
parametru în semnătura expresiei lambda. În schimb, puteți pur și simplu să vă referiți la acesta ca la aceasta
.
// Aceasta expresie lambda foloseste variabila val doubler1 = Doubler 2 * it // este echivalenta cu aceasta expresie lambda obisnuita val doubler2 = Doubler numar -> 2 * numar
Ca dezvoltator Java, s-ar putea să fiți înclinat să creați interfețe SAM în Kotlin. Făcând acest lucru, cu toate acestea, de obicei nu este o idee bună. Dacă creați o interfață SAM în Kotlin sau creați o metodă Kotlin care așteaptă ca un obiect de implementare a unei interfețe SAM ca argument, facilitatea de conversie SAM nu va fi disponibilă pentru dvs. Conversia SAM este o caracteristică de interoperabilitate Java și este limitată la Java clase și interfețe.
Deoarece Kotlin susține funcții de funcții de ordin superior care pot lua alte funcții ca argumente - nu va trebui niciodată să creați interfețe SAM în el. De exemplu, dacă Calculator
clasa este rescrisă în Kotlin setAdder ()
metoda poate fi scrisă astfel încât să ia în mod direct o funcție ca argument, în loc de un obiect care implementează Sumator
interfață.
(a: Int, b: Int) -> Int = a, b -> 0 // Introducere implicită // Setterul este disponibil în mod implicit pentru fun add (a: Int, b: Int) Log.d ("CALCULATOR", "Sum este" + adder (a, b))
În timp ce utilizați clasa de mai sus, puteți seta sumator
la o expresie a unei funcții sau lambda folosind =
operator. Următorul cod vă arată cum:
Calculator () calculator.adder = aceasta :: myCustomAdd // SAU calculator.adder = a, b -> a + b
Aplicațiile Android API sunt în mare parte scrise în Java, iar multe utilizează interfețele SAM extensiv. Același lucru se poate spune și despre majoritatea bibliotecilor terțe. Folosind tehnicile pe care le-ați învățat în acest tutorial, puteți lucra cu ele în codul dvs. Kotlin într-un mod concis și ușor de citit.
Pentru a afla mai multe despre caracteristicile de interoperabilitate Java ale lui Kotlin, consultați documentația oficială. Și verificați câteva din celelalte tutoriale ale dezvoltării aplicațiilor Android!