Schneller Tipp Schreiben Sie Cleaner-Code mit Kotlin SAM Conversions

Wenn Sie ein erfahrener Android-Anwendungsentwickler sind, sind Sie wahrscheinlich an die Ausführlichkeit von Java 7 gewöhnt. Als Ergebnis könnte es sein, dass Sie Kotlins kurze Syntax finden, die auf funktionale Programmierer abzielt und etwas beunruhigt.

Ein häufiges Problem, auf das Anfänger beim Lernen von Kotlin stoßen, ist das Verständnis dafür, wie Sie mit Java-Schnittstellen arbeiten, die eine einzige Methode enthalten. Solche Schnittstellen sind in der Android-Welt allgegenwärtig und werden oft als SAM-Schnittstellen bezeichnet, wobei SAM für Single Abstract Method steht.

In diesem kurzen Lernprogramm erfahren Sie alles, was Sie wissen müssen, um die SAM-Schnittstellen von Java in Kotlin-Code zu verwenden.

1. Was ist eine SAM-Konvertierung??

Wenn Sie eine Java-Schnittstelle verwenden möchten, die eine einzige Methode in Ihrem Kotlin-Code enthält, müssen Sie keine anonyme Klasse manuell erstellen, die sie implementiert. Stattdessen können Sie einen Lambda-Ausdruck verwenden. Dank eines Prozesses, der als SAM-Konvertierung bezeichnet wird, kann Kotlin jeden Lambda-Ausdruck, dessen Signatur mit der der einzelnen Methode der Schnittstelle übereinstimmt, transparent in eine Instanz einer anonymen Klasse konvertieren, die die Schnittstelle implementiert.

Betrachten Sie beispielsweise die folgende Java-Schnittstelle mit einer Methode:

öffentliche Schnittstelle Adder public void add (int a, int b); 

Ein naiver und Java 7-ähnlicher Ansatz für die Verwendung der obigen Schnittstelle würde das Arbeiten mit einer Objekt Ausdruck und würde so aussehen:

// Instanz einer anonymen Klasse erstellen // mit dem Objektschlüsselwort val adder = object: Adder überschreibe fun add (a: Int, b: Int): Int return a + b

Das ist viel unnötiger Code, der auch nicht gut lesbar ist. Durch die Nutzung der SAM-Konvertierungsfunktion von Kotlin können Sie jedoch stattdessen den folgenden äquivalenten Code schreiben:

// Instanz mit einem Lambda-Val-Addierer erstellen = Adder a, b -> a + b

Wie Sie sehen, haben wir nun die anonyme Klasse durch einen kurzen Lambda-Ausdruck ersetzt, dem der Name der Schnittstelle vorangestellt ist. Beachten Sie, dass die Anzahl der Argumente, die der Lambda-Ausdruck verwendet, der Anzahl der Parameter in der Signatur der Methode der Schnittstelle entspricht.

2. SAM-Konvertierungen in Funktionsaufrufen

Wenn Sie mit Java-Klassen arbeiten, deren Methoden SAM-Typen als Argumente verwenden, können Sie die obige Syntax weiter vereinfachen. Betrachten Sie zum Beispiel die folgende Java-Klasse, die eine Methode enthält, die ein Objekt erwartet, das den implementiert Adder Schnittstelle:

öffentliche Klasse Rechner private Adder adder; public void setAdder (Adder-Addierer) this.adder = Addierer;  public void add (int a, int b) Log.d ("CALCULATOR", "Summe ist" + adder.add (a, b)); 

In Ihrem Kotlin-Code können Sie jetzt direkt einen Lambda-Ausdruck an den übergeben setAdder () Methode, ohne den Namen der Adder Schnittstelle.

val rechner = Rechner () rechner.setAdder (a, b -> a + b)

Es ist erwähnenswert, dass Sie beim Aufruf einer Methode, die einen SAM-Typ als einziges Argument verwendet, die Klammern überspringen können, um Ihren Code noch präziser zu gestalten.

rechner.setAdder a, b -> a + b

3. SAM-Konvertierungen ohne Lambdas

Wenn Sie der Meinung sind, dass Lambda-Ausdrücke verwirrend sind, habe ich gute Neuigkeiten für Sie: SAM-Konvertierungen funktionieren auch mit normalen Funktionen. Betrachten Sie zum Beispiel die folgende Funktion, deren Signatur mit der von übereinstimmt Adder Methode der Schnittstelle:

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

Kotlin ermöglicht es Ihnen, die myCustomAdd () Funktion als Argument für die setAdder () Methode der Taschenrechner Klasse. Vergessen Sie nicht, die Methode mit der :: Operator. Hier ist wie:

calculator.setAdder (this :: myCustomAdd)

4. Die es Variable

In vielen Fällen enthalten SAM-Schnittstellen Ein-Parameter-Methoden. Eine Ein-Parameter-Methode hat, wie der Name schon sagt, nur einen Parameter in der Signatur. Bei der Arbeit mit solchen Schnittstellen können Sie in Kotlin den Parameter in der Signatur Ihres Lambda-Ausdrucks weglassen und eine implizite Variable mit dem Namen verwenden es im Körper des Ausdrucks. Um die Dinge klarer zu machen, betrachten Sie die folgende Java-Schnittstelle:

öffentliche Schnittstelle Doubler public int doubleIt (int number); 

Während der Verwendung der Doppler Schnittstelle in Ihrem Kotlin-Code, müssen Sie das nicht explizit erwähnen Nummer Parameter in der Signatur Ihres Lambda-Ausdrucks. Stattdessen können Sie es einfach als bezeichnen es.

// Dieser Lambda-Ausdruck mit der it-Variablen val doubler1 = Doubler 2 * it // entspricht diesem gewöhnlichen Lambda-Ausdruck val doubler2 = Doubler number -> 2 * number

5. SAM-Schnittstellen in Kotlin

Als Java-Entwickler können Sie in Kotlin SAM-Schnittstellen erstellen. Dies ist jedoch normalerweise keine gute Idee. Wenn Sie eine SAM-Schnittstelle in Kotlin erstellen oder eine Kotlin-Methode erstellen, die ein Objekt erwartet, das eine SAM-Schnittstelle als Argument implementiert, steht Ihnen die SAM-Konvertierungsfunktion nicht zur Verfügung. Die SAM-Konvertierung ist eine Java-Interoperabilitätsfunktion und auf Java beschränkt Nur Klassen und Schnittstellen.

Da Kotlin Funktionen mit höherer Ordnung unterstützt, können andere Funktionen als Argumente verwendet werden. In diesem Fall müssen Sie niemals SAM-Schnittstellen erstellen. Zum Beispiel, wenn die Taschenrechner Klasse wird in Kotlin umgeschrieben setAdder () Die Methode kann so geschrieben werden, dass sie direkt eine Funktion als Argument verwendet, anstelle eines Objekts, das die Adder Schnittstelle.

Klassenrechner var addder: (a: Int, b: Int) -> Int = a, b -> 0 // Standardimplementierung // Setter ist standardmäßig verfügbar fun add (a: Int, b: Int)  Log.d ("CALCULATOR", "Summe ist" + Addierer (a, b))

Bei Verwendung der obigen Klasse können Sie festlegen Addierer auf eine Funktion oder einen Lambda-Ausdruck mit der = Operator. Der folgende Code zeigt Ihnen wie:

val rechner = Rechner () calculator.adder = this :: meinCustomAdd // ODER rechner.adder = a, b -> a + b

Fazit

Android-APIs sind größtenteils in Java geschrieben, und viele verwenden SAM-Schnittstellen umfassend. Dasselbe gilt auch für die meisten Bibliotheken von Drittanbietern. Durch die Verwendung der in diesem Lernprogramm erlernten Techniken können Sie in Ihrem Kotlin-Code auf kurze und leicht lesbare Weise mit ihnen arbeiten.

Weitere Informationen zu den Java-Interoperabilitätsfunktionen von Kotlin finden Sie in der offiziellen Dokumentation. Schauen Sie sich auch unsere anderen Tutorials zur Android-App-Entwicklung an!