Kotlin-Funktionen und Lambdas zum Senden an Java-Entwickler

Funktionsdefinition

Die Funktion ist wie folgt definiert.

//Eine Funktion, die Argumente vom Typ Int erhöht und zurückgibt
fun increment(i: Int): Int {
    return i + 1
}

Spaß Funktionsname ( Argumentliste): Rückgabetyp Dies ist die Grundform.

Benannte Argumente

Welcher Wert entspricht welchem Argument in einem Funktionsaufruf mit vielen Argumenten Es kann schwer zu verstehen sein.

Kotlin hat die Fähigkeit, dieses Problem zu lösen.

/*
 *Ich werde Takoyaki bestellen
 *
 * @param isKarashiMayo Gibt an, ob Karashi Mayonnaise ausgewählt werden soll
 * @param isPutAonori Gibt an, ob blauer Kleber aufgetragen werden soll oder nicht
 *
 * @return Eine Instanz von Takoyaki wird zurückgegeben
 */
fun oderTakoyaki(isKarashiMayo: Boolean, isPutAonori: Boolean): Takoyaki {
    // ...
}

val takoyaki = oderTakoyaki(true, false)
//Welche Flagge ist blauer Kleber?


val takoyaki = oderTakoyaki(isKarashiMayo = true, isPutAonori = false)
//Sie können dem Anrufer einen formalen Argumentnamen geben
//Einfach zu lesende Code-Absicht


val takoyaki = oderTakoyaki(isPutAonori = false, isKarashiMayo = true)
//Wenn Sie ihm einen Namen geben, muss er nicht in der in der Funktion definierten Reihenfolge sein.

Standardargument

Ich denke, es gibt viele Klassen, die viele Überladungen mit unterschiedlicher Anzahl von Argumenten haben. Zum Beispiel ...

Durch die Verwendung von Standardargumenten in Kotlin können Sie diese Situation zunehmender Variationen vermeiden.

/*
 *Ich werde Takoyaki bestellen
 *
 * @param isKarashiMayo Gibt an, ob Karashi Mayonnaise ausgewählt werden soll
 * @param isPutAonori Gibt an, ob blauer Kleber aufgetragen werden soll oder nicht
 *
 * @return Eine Instanz von Takoyaki wird zurückgegeben
 */
fun oderTakoyaki(isKarashiMayo: Boolean = false, isPutAonori: Boolean = true): Takoyaki {
    // ...
}

//Argumente können zum Zeitpunkt des Aufrufs weggelassen werden. Wenn nicht angegeben, wird der Standardwert verwendet.
val takoyaki = oderTakoyaki()

Erweiterungsfunktion

Sie können später vorhandenen Klassen Funktionen hinzufügen. Fügen wir dem String-Typ eine Funktion hinzu, die in unserem eigenen Datumsformat analysiert wird.

fun String.toDate(): Date {
    val format = SimpleDateFormat("JJJJ Jahr MM Monat TT Tag")
    return format.parse(this)
}

val str = "09. März 2019"
val date = str.toDate()

fun Erweiterter Typ . Funktionsname ( Argumentliste): Rückgabewert Definieren Sie als ↑. Die übliche Funktion ist übrigens ... Spaß Funktionsname ( Argumentliste): Rückgabetyp ↑ Es war so. Wenn Sie vor dem Funktionsnamen einen Typ des Erweiterungsziels hinzufügen, wird dies zu einer Erweiterungsfunktion.

Übrigens heißt dieses Erweiterungszielobjekt in Kotlin ** Empfängerobjekt **.

Einzelausdrucksfunktion

Wenn die Funktion aus einem Ausdruck besteht, kann das {} weggelassen werden. Funktionen für einzelne Ausdrücke können den Rückgabetyp auch weglassen, wenn der Rückgabetyp abgeleitet werden kann.

//Normale Funktion
fun double(x: Int): Int {
    return x * 2
}

//Beschrieben als einzelne Ausdrucksfunktion
fun double(x: Int): Int = x * 2

//Leiten Sie den Rückgabetyp mit einer einzelnen Ausdrucksfunktion ab
fun double(x: Int) = x * 2

Lambda-Stil

Der Lambda-Ausdruck wird als ↓ geschrieben.

val sum = { x: Int, y: Int ->
    x + y
}

{Argument list-> Body} Oder wenn es kein Argument gibt {Hauptkörper} Es wird sein.

Die implizite Variable it kann verwendet werden, wenn der Lambda-Ausdruck einen Parameter hat.

val double: (Int)->Int = {
    it * 2
}

Der Funktionstyp wird wie folgt beschrieben. (Argument type) -> Return type

Inline-Funktion

Der Lambda-Ausdruck ist ein Mechanismus mit hohen Ausführungskosten. Kotlins Lambda-Ausdruck ist als anonyme Klasse implementiert. Jedes Mal, wenn ein Lambda-Ausdruck ausgeführt wird, der eine Variable erfasst, wird eine Instanz der anonymen Klasse erstellt.

Daher ist es eine Inline-Funktion. Die Inline-Funktion wird kompiliert, indem der Funktionskörper ersetzt wird, in dem sie aufgerufen wird.

inline fun edit(context: DataBaseContext, block: (DataBaseContext.Transaction)->Unit) {
    val transaction = context.beginTransaction() // 1.Transaktionsstart
    block(transaction) // 2.Argument Lambda-Ausführung
    transaction.commit() // 3.Ende der Transaktion
}

Die Inline-Funktion ist wirksam Eine Funktion, die einen Lambda-Ausdruck als Argument verwendet und intern ausführt. Die Inline-Funktion erweitert auch den Argument-Lambda-Ausdruck auf den Aufrufer.

Dies ist ein Beispiel, das die Ueno-Inline-Funktion "edit" aufruft.

val dataBaseContext = DataBaseContext()

edit(dataBaseContext) { transaction ->
    val newObject = Any()
    transaction.add(newObject)
}

Die Funktion "Bearbeiten" wird zur Kompilierungszeit erweitert und sieht wie folgt aus: Bild (Bild)

val dataBaseContext = DataBaseContext()

//Die Bearbeitungsfunktion wird von hier aus erweitert
val transaction = dataBaseContext.beginTransaction() // 1.Transaktionsstart
val newObject = Any() // 2.Argument Lambda-Erweiterung
transaction.add(newObject) // 2.Argument Lambda-Erweiterung
transaction.commit() // 3.Ende der Transaktion
//Die Bearbeitungsfunktion wird bisher erweitert

Ein weiterer Inline kommt ins Spiel

Kotlin-Generika verlieren zur Laufzeit Typinformationen.

Die folgende Funktion führt beispielsweise zu einem Kompilierungsfehler.

fun <T> mapFilter(list: List<Any>): List<T> {
    return list.filter { it is T }
        .map { it as T }
}

Dies liegt daran, dass der Typparameter T der Funktion mapFilter zur Laufzeit verloren geht. Fügen Sie daher der Inline-Funktion den Modifikator "reified" hinzu.

//↓ Hier!
inline fun <reified T> mapFilter(list: List<Any>): List<T> {
    return list.filter { it is T }
        .map { it as T }
}

Auf diese Weise wird es erweitert, während die Typinformationen zur Laufzeit beibehalten werden. Die Funktion mapFilter kann jetzt kompiliert werden.

Recommended Posts

Kotlin-Funktionen und Lambdas zum Senden an Java-Entwickler
Kotlin-Scope-Funktionen zum Senden an Java-Entwickler
Kotlin-Klasse zum Senden an Java-Entwickler
Kotlins Klasse Teil 2 zum Senden an Java-Entwickler
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
Kotlins Null-Sicherheit zum Senden an Java-Entwickler
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Unterschiede zwischen "Anfänger" Java und Kotlin
Kotlin-Generika für Java-Entwickler
[Android] Konvertieren Sie Android Java-Code in Kotlin
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Hinweise zum Erstellen der Kotlin-Entwicklungsumgebung und zur Migration von Java nach Kotlin
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
Konvertierung zwischen Kotlin nullable und Java Optional
Beziehung zwischen Kotlin- und Java-Zugriffsmodifikatoren
Konvertieren Sie alle Android-Apps (Java) in Kotlin
Java-Implementierung zum Erstellen und Lösen von Labyrinthen
[Für Anfänger] Unterschied zwischen Java und Kotlin
[Java] Wie man Dateien ausgibt und schreibt!
Ein Java-Ingenieur verglich Swift, Kotlin und Java.
Einführung in Kotlin für iOS-Entwickler lin ー Kotlin-Erstellung
Java: So senden Sie Werte von Servlet zu Servlet
Tipps zur Interoperabilität mit Kotlin zum Senden an Java-Entwickler
[Einführung in Java] Informationen zu Variablendeklarationen und -typen
Einführung in Kotlin für iOS-Entwickler ④-Typ
Memo für die Migration von Java nach Kotlin
Von Java nach C und von C nach Java in Android Studio
Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Java switch Anweisung und break, Kotlin beim Ausdruck ...
Einführung in Kotlin in ein bestehendes Java Maven-Projekt
Ich möchte eine E-Mail in Java senden.
Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot
Versuchen Sie, Ruby und Java in Dapr zu integrieren
Laden Sie Notizen in Java in den Azure-Speicher hoch und laden Sie sie herunter
Grundeinstellungen für das Umschreiben von Java-Projekten in Kotlin
Einführung in Kotlin für iOS-Entwickler ⑤-Practical XML
Wie man Java SE8 Gold bekommt und studiert
Einführung in Kotlin für iOS-Entwickler ③-About gradle
Java 8 startet jetzt ~ für jeden und Lambda-Ausdruck ~
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
Einführung in Kotlin für iOS-Entwickler ①-Umgebungskonstruktion
Wo Java-Programmierer dazu neigen, über Kotlin zu stolpern
Einführung in Kotlin für iOS-Entwickler ②-Projekterstellung
Wie schreibe ich Java String # getBytes in Kotlin?
Was Java-Unerfahrene getan haben, um Kotlin zu studieren
So greifen Sie auf Java Private-Methoden und -Felder zu
[Java] Verwendung der Kalenderklasse und der Datumsklasse
Funktionen und Methoden
[Java] Einführung in Java
Java und JavaScript
XXE und Java
Einführung in Java
Aufrufen von Funktionen in großen Mengen mit Java Reflection
Beherrschen von Kotlin ~ Konvertieren von Java-Dateien in Kotlin-Dateien Road to Graduation ~ Teil 3
Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen