[JAVA] Kotlin Infix

Was ist das

Ich habe mich gefragt, was Kotlins reserviertes Wort, Infix, ist, also habe ich die Definition nachgeschlagen und wie man es macht.

Inhaltsverzeichnis

Irgendwie reparieren

An erster Stelle. Was ist ein Infix? Ich kenne keine englischen Wörter (lacht) Wenn ich die Google-Übersetzung ausführe, wird "inside" zurückgegeben. Mir ist hier aufgefallen, dass dies eine der Korrekturen ist. Es gibt andere Korrekturen, die ich oft benutze. prefix、suffix。 Buchstäblich in der Mitte ist es eine Funktion von Kotlin, die eine Funktion definieren kann, die eine Infix-Funktion zwischen Objekten und Werten und Prozessen mit zwei Sandwich-Objekten und Werten als Argumenten platziert.

Beispiel für eine Standardbibliothek: "to"

Die Infix-Funktion "to" der Standardbibliothek wird wie folgt aufgerufen, um eine "Pair" -Instanz zu erstellen.

Pair.kt


val pair: Pair<String, String> = "key" to "value"

Die Methode ist wie unten gezeigt als Erweiterungsfunktion definiert.

Standard.kt


/**

 * Creates a tuple of type [Pair] from this and [that]. 
 * 
 * This can be useful for creating [Map] literals with less noise, for example: 
 * @sample samples.collections.Maps.Instantiation.mapFromPairs 
 */
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that) 

Referenz: Tuples.kt

Dann möchte ich meine eigene Infix-Funktion erstellen.

Definieren Sie Infix-Funktionen

Stellen Sie sich einen Fall vor, auf den Sie häufig stoßen: "Nachfüllen von Werten in Instanzen ähnlicher Objekte mit ähnlichen Objekten". Erstellen Sie hier eine Funktion, die dem Wert der Klasse "Customer" eine Verlaufssequenz hinzufügt, um eine Instanz der Klasse "CustomerHistory" zu erstellen, und geben Sie eine "Pair" -Instanz zurück, die diese Instanzen in den Generika enthält.

Definieren Sie zunächst die Datenklasse, die das Ergebnis der Eingabe und Synthese sein soll.

Data.kt


data class Customer (
        var id: String,
        var name: String
)

data class CustomerHistory (
        var id: String,
        var name: String,
        var seq: Int
)

Definieren Sie die Infix-Funktion, die eine "CustomerHistory" -Instanz mit einer Sequenz aus dem Originalmaterial "Customer" erstellt, wie folgt.

Infix.kt


/**
 *Der Empfänger wird innerhalb der Erweiterungsfunktion so behandelt. Die Sequenz wird als Argument der Funktion empfangen.
 */
infix fun Customer.mapToHistory(seq: Int): Pair<Customer, CustomerHistory> = Pair(
        this,
        CustomerHistory(
                this.id,
                this.name,
                seq
        )
)

Jetzt bist du bereit. Rufen wir nun die Infix-Funktion auf, die aus Kotlin-Code und Java-Code definiert ist.

Rufen Sie die definierte Infix-Funktion von Kotlin aus auf

Rufen Sie die oben definierte selbst erstellte Infix-Funktion auf.

Caller.kt


//Frühere Geschichte.
val customer: Customer = Customer("00001", "Eron Musk")

//Gibt das Originalmaterial und das Paar des Verlaufsobjekts mit einer Sequenz zurück.
val pair: Pair<Customer, CustomerHistory> = customer mapToHistory 2

Die definierte Funktion war als Beispiel nicht gut und schwer zu verstehen, aber Sie können das Ergebnis erhalten, indem Sie die definierte Funktion zwischen Objekten und Werten platzieren.

Rufen Sie die definierte Infix-Funktion von Java aus auf

Aufgrund der Interoperabilität von Kotlin kann es auch von Java aus aufgerufen werden. Wenn Sie einen Ausschnitt eines ähnlichen Aufrufs in Java versuchen

Caller.java


/**
 *Der Rückgabewert ist Kotlin, das in Kotlins Bibliothek enthalten ist..Paar importieren und definieren.
 */
public static void printHistory(Customer customer) {
        Pair<Customer, CustomerHistory> customerHistory = InfixKt.mapToHistory(customer, 2);
}

Immerhin habe ich es erwartet, aber aus Javas Sicht ist die Infix-Funktion eine statische Methode.

Invers montieren Sie die Infix-Funktion

Die definierte Kotlin-Datei wurde mit kotlinc kompiliert.

Ich kann mir das Anweisungsverfahren fast vorstellen, wenn ich mir den Aufruf von Java ansehe, aber ich bin neugierig. Lassen Sie uns also die kompilierte Kotlin-Datei (Klassendatei) in umgekehrter Reihenfolge zusammenstellen.


mac:classes user$ javap InfixKt.class
Compiled from "Infix.kt"
public final class InfixKt {
  public static final kotlin.Pair<Customer, CustomerHistory> mapToHistory(Customer, int);
}

Wahnsinnig wie erwartet ... Kotlin-Dateien ohne Klassen oder mehrere Klassen werden beim Kompilieren \ Kt genannt. Der ursprüngliche Dateiname war "Infix.kt". Wenn man das Ergebnis der umgekehrten Montage betrachtet, handelt es sich um eine statische Methode, die in der endgültigen Klasse enthalten ist.

2020-07-02: Nachtrag Es ist eine statische Methode, da die von mir erstellte Funktion eine Erweiterungsfunktion ist.

Fügen Sie eine Option zu "javap" hinzu und versuchen Sie, etwas detailliertere Informationen auszugeben.

mac:classes user$ javap -c -l -p InfixKt.class
Compiled from "Infix.kt"
public final class InfixKt {
  public static final kotlin.Pair<Customer, CustomerHistory> mapToHistory(Customer, int);
    Code:
       0: aload_0
       1: ldc           #10                 // String $this$mapToHistory
       3: invokestatic  #16                 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
       6: new           #18                 // class kotlin/Pair
       9: dup
      10: aload_0
      11: new           #20                 // class CustomerHistory
      14: dup
      15: aload_0
      16: invokevirtual #26                 // Method Customer.getId:()Ljava/lang/String;
      19: aload_0
      20: invokevirtual #29                 // Method Customer.getName:()Ljava/lang/String;
      23: iload_1
      24: invokespecial #33                 // Method CustomerHistory."<init>":(Ljava/lang/String;Ljava/lang/String;I)V
      27: invokespecial #36                 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      30: areturn
    LineNumberTable:
      line 12: 6
      line 13: 10
      line 14: 11
      line 15: 15
      line 16: 19
      line 17: 23
      line 14: 24
      line 12: 27
      line 19: 30
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0      31     0 $this$mapToHistory   LCustomer;
          0      31     1   seq   I
}

Schließlich scheint es sich um einen Java-Operationscode zu handeln, den ich auch nach dem Kompilieren kannte.

Zusammenfassung von 3 Zeilen

――Infix ist ein Wort, das sich auf die Inschrift bezieht und wie zwischen Präfixen / Suffixen platziert wird.

Referenz

Bücher Kotlin in Aktion

Webseite [Interne Notation-Kotlin-Referenz](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/functions.html#%E4%B8%AD%E7%BD%AE%E8% A8% 98% E6% B3% 95)

Recommended Posts

Kotlin Infix
Über Kotlin
Kotlin Bytecode
HMAC in Kotlin
Kotlin Spickzettel
Kotlin-Studienbuch (Kotlin)