[JAVA] Infixe de Kotlin

Qu'est-ce que c'est

Je me demandais quel était le mot réservé de Kotlin, infixe, alors j'ai recherché la définition et comment la créer.

table des matières

En quelque sorte réparer

En premier lieu. Qu'est-ce qu'un infixe? Je ne connais pas les mots anglais (rires) Lorsque j'exécute la traduction Google, il renvoie "à l'intérieur". J'ai remarqué ici que c'est l'un des correctifs. Il existe d'autres correctifs que j'utilise souvent. prefix、suffix。 Littéralement au milieu, c'est une fonction de Kotlin qui peut définir une fonction qui met une fonction d'infixe entre des objets et des valeurs et des processus avec deux objets et valeurs en sandwich comme arguments.

Exemple de bibliothèque standard: "à"

La fonction infixe to de la bibliothèque standard est appelée comme suit pour créer une instance Pair.

Pair.kt


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

La méthode est définie comme une fonction d'extension comme indiqué ci-dessous.

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) 

Référence: Tuples.kt

Ensuite, j'aimerais créer ma propre fonction d'infixe.

Définir les fonctions d'infixe

Imaginez un cas que vous rencontrez souvent, «remplissant des valeurs dans des instances d'objets similaires qui ont des objets similaires». Ici, créez une fonction qui attache une séquence d'historique à la valeur de la classe Customer pour créer une instance de la classe CustomerHistory, et retourne une instance Pair qui inclut ces instances dans les génériques.

Tout d'abord, définissez la classe de données qui sera le résultat de l'entrée et de la synthèse.

Data.kt


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

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

Définissez la fonction d'infixe qui crée une instance CustomerHistory avec une séquence à partir du matériau d'origine Customer comme suit.

Infix.kt


/**
 *Le récepteur est traité comme cela dans la fonction d'extension. La séquence est reçue en tant qu'argument de la fonction.
 */
infix fun Customer.mapToHistory(seq: Int): Pair<Customer, CustomerHistory> = Pair(
        this,
        CustomerHistory(
                this.id,
                this.name,
                seq
        )
)

Vous êtes maintenant prêt. Maintenant, appelons la fonction infixe définie à partir du code Kotlin et du code Java.

Appelez la fonction d'infixe définie depuis Kotlin

Appelez la fonction d'infixe personnalisée définie ci-dessus.

Caller.kt


//Ancienne histoire.
val customer: Customer = Customer("00001", "Eron Musk")

//Renvoie le matériau d'origine et la paire de l'objet historique avec une séquence.
val pair: Pair<Customer, CustomerHistory> = customer mapToHistory 2

La fonction définie n'était pas un bon exemple et elle est difficile à comprendre, mais vous pouvez obtenir le résultat en plaçant la fonction définie entre les objets et les valeurs.

Appelez la fonction d'infixe définie à partir de Java

En raison de l'interopérabilité de Kotlin, il peut également être appelé depuis Java. Si vous essayez un extrait d'un appel similaire en Java

Caller.java


/**
 *La valeur de retour est kotlin inclus dans la bibliothèque de Kotlin..Importez et définissez Pair.
 */
public static void printHistory(Customer customer) {
        Pair<Customer, CustomerHistory> customerHistory = InfixKt.mapToHistory(customer, 2);
}

Après tout, je m'y attendais, mais du point de vue de Java, la fonction infixe est une méthode statique.

Inverse assemble la fonction infixe

Le fichier Kotlin défini a été compilé avec kotlinc.

Je peux presque imaginer la procédure d'instruction en regardant l'appel de Java, mais je suis curieux. Alors, réassemblons le fichier Kotlin compilé (fichier de classe).


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

Comme prévu ... Les fichiers Kotlin sans classes ou classes multiples sont nommés \ Kt une fois compilés. Le nom du fichier d'origine était ʻInfix.kt`. En regardant le résultat de l'assemblage inversé, il s'agit d'une méthode statique incluse dans la classe finale.

2020-07-02: Addendum C'est une méthode statique car la fonction que j'ai créée est une fonction d'extension.

Ajoutez une option à javap et essayez de produire des informations un peu plus détaillées.

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
}

Après tout, il semble que ce soit un code d'opération Java que je connaissais même après sa compilation.

Résumé de 3 lignes

――Infixe est un mot qui fait référence à l'inscription et revient à être placé entre des préfixes / suffixes.

référence

Livres Kotlin en action

site Internet [Notation interne - référence Kotlin](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

Infixe de Kotlin
À propos de Kotlin
Kotlin Bytecode
HMAC à Kotlin
Aide-mémoire de Kotlin
Livre d'étude Kotlin (Kotlin)