Suggerimento rapido scrivi il codice Cleaner con le conversioni SAM Kotlin

Se sei uno sviluppatore di applicazioni Android esperto, probabilmente sei abituato alla prolissità di Java 7. Di conseguenza, potresti trovare la sintassi concisa di Kotlin, orientata verso programmatori funzionali, leggermente inquietante.

Un problema comune che i principianti incontrano durante l'apprendimento di Kotlin è capire come si aspetta che tu lavori con le interfacce Java che contengono un singolo metodo. Tali interfacce sono onnipresenti nel mondo Android e sono spesso indicate come interfacce SAM, dove SAM è l'abbreviazione di Single Abstract Method.

In questo breve tutorial, imparerai tutto ciò che devi sapere per utilizzare in modo appropriato le interfacce SAM di Java nel codice Kotlin.

1. Che cos'è una conversione SAM?

Quando si desidera utilizzare un'interfaccia Java contenente un singolo metodo nel codice Kotlin, non è necessario creare manualmente una classe anonima che la implementa. Invece, puoi usare un'espressione lambda. Grazie a un processo chiamato conversione SAM, Kotlin può convertire in modo trasparente qualsiasi espressione lambda la cui firma corrisponda a quella del singolo metodo dell'interfaccia in un'istanza di una classe anonima che implementa l'interfaccia.

Ad esempio, considerare la seguente interfaccia Java a un solo metodo:

Adder di interfaccia pubblica public void add (int a, int b); 

Un approccio ingenuo e simile a Java 7 per l'utilizzo dell'interfaccia precedente comporterebbe il lavoro con un oggetto espressione e assomiglierebbe a questo:

// Creazione dell'istanza di una classe anonima // utilizzando l'oggetto keyword val adder = object: Adder override fun add (a: Int, b: Int): Int return a + b

Questo è un sacco di codice non necessario, che non è nemmeno molto leggibile. Sfruttando la funzione di conversione SAM di Kotlin, tuttavia, è possibile scrivere il seguente codice equivalente, invece:

// Creazione dell'istanza usando lambda val adder = Adder a, b -> a + b

Come puoi vedere, abbiamo sostituito la classe anonima con un'espressione lambda breve, che è preceduta dal nome dell'interfaccia. Si noti che il numero di argomenti richiesti dall'espressione lambda è uguale al numero di parametri nella firma del metodo dell'interfaccia.

2. Conversioni SAM in chiamate di funzione

Mentre si lavora con le classi Java con metodi che accettano i tipi SAM come argomenti, è possibile semplificare ulteriormente la sintassi precedente. Ad esempio, si consideri la seguente classe Java, che contiene un metodo che si aspetta un oggetto che implementa il vipera interfaccia:

public class Calculator private Adder adder; public void setAdder (Adder adder) this.adder = adder;  public void add (int a, int b) Log.d ("CALCULATOR", "Sum is" + adder.add (a, b)); 

Nel tuo codice Kotlin, puoi ora passare direttamente un'espressione lambda al setAdder () metodo, senza prefisso con il nome del vipera interfaccia.

val calculator = Calculator () calculator.setAdder (a, b -> a + b)

Vale la pena notare che mentre si chiama un metodo che accetta un tipo SAM come unico argomento, si è liberi di saltare la parentesi per rendere il codice ancora più conciso.

calculator.setAdder a, b -> a + b

3. Conversioni SAM senza Lambda

Se pensi che le espressioni lambda siano confuse, ho buone notizie per te: le conversioni SAM funzionano bene anche con le normali funzioni. Ad esempio, si consideri la seguente funzione la cui firma corrisponde a quella del vipera metodo dell'interfaccia:

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

Kotlin ti permette di passare direttamente il myCustomAdd () funzione come argomento per il setAdder () metodo del Calcolatrice classe. Non dimenticare di fare riferimento al metodo usando il :: operatore. Ecco come:

calculator.setAdder (this :: myCustomAdd)

4. Il esso Variabile

Molte volte, le interfacce SAM contengono metodi a un parametro. Un metodo a un parametro, come suggerisce il nome, ha un solo parametro nella sua firma. Mentre lavora con tali interfacce, Kotlin ti permette di omettere il parametro nella firma della tua espressione lambda e di usare una variabile implicita chiamata esso nel corpo dell'espressione. Per rendere le cose più chiare, considera la seguente interfaccia Java:

interfaccia pubblica Doubler public int doubleIt (int number); 

Durante l'utilizzo del Doubler interfaccia nel tuo codice Kotlin, non devi menzionare esplicitamente il numero parametro nella firma della tua espressione lambda. Invece, puoi semplicemente fare riferimento ad esso come esso.

// Questa espressione lambda che usa la variabile it val doubler1 = Doubler 2 * it // è equivalente a questa espressione lambda ordinaria val doubler2 = Doubler numero -> 2 * numero

5. Interfacce SAM in Kotlin

Come sviluppatore Java, potresti essere propenso a creare interfacce SAM in Kotlin. Farlo, tuttavia, di solito non è una buona idea. Se crei un'interfaccia SAM in Kotlin, o crei un metodo Kotlin che si aspetta un oggetto che implementa un'interfaccia SAM come argomento, la funzione di conversione SAM non sarà disponibile per te: la conversione SAM è una funzionalità di interoperabilità Java ed è limitata a Java solo classi e interfacce.

Poiché Kotlin supporta funzioni di ordine superiore, funzioni che possono assumere altre funzioni come argomenti, non è necessario creare interfacce SAM in esso. Ad esempio, se il Calcolatrice la classe viene riscritta in Kotlin, la sua setAdder () il metodo può essere scritto in modo tale che prende direttamente una funzione come argomento, anziché un oggetto che implementa il vipera interfaccia.

class Calculator var adder: (a: Int, b: Int) -> Int = a, b -> 0 // Implementazione predefinita // Setter è disponibile per impostazione predefinita fun add (a: Int, b: Int)  Log.d ("CALCOLATORE", "Somma è" + sommatore (a, b))

Mentre si utilizza la classe sopra, è possibile impostare vipera a una funzione o un'espressione lambda usando il = operatore. Il seguente codice mostra come:

val calculator = Calculator () calculator.adder = this :: myCustomAdd // OR calculator.adder = a, b -> a + b

Conclusione

Le API di Android sono scritte in gran parte in Java e molte utilizzano ampiamente le interfacce SAM. Lo stesso si può dire della maggior parte delle biblioteche di terze parti. Usando le tecniche apprese in questo tutorial, puoi lavorare con loro nel tuo codice Kotlin in un modo conciso e facile da leggere.

Per ulteriori informazioni sulle funzionalità di interoperabilità Java di Kotlin, fare riferimento alla documentazione ufficiale. E controlla alcuni dei nostri altri tutorial sullo sviluppo di app per Android!