Fonctions Kotlin et lambdas à envoyer aux développeurs Java

Définition des fonctions

La fonction est définie comme suit.

//Une fonction qui incrémente et renvoie des arguments de type Int
fun increment(i: Int): Int {
    return i + 1
}

fun function name (ʻargument list): return type` Ceci est la forme de base.

Arguments nommés

Quelle valeur correspond à quel argument dans un appel de fonction avec de nombreux arguments Cela peut être difficile à comprendre.

Kotlin a la capacité de résoudre ce problème.

/*
 *Je commanderai du takoyaki
 *
 * @param isKarashiMayo Choix de la mayonnaise Karashi
 * @param isPutAonori Mettre ou non de la colle bleue
 *
 * @return Une instance de Takoyaki est retournée
 */
fun oderTakoyaki(isKarashiMayo: Boolean, isPutAonori: Boolean): Takoyaki {
    // ...
}

val takoyaki = oderTakoyaki(true, false)
//Quel drapeau est de la colle bleue?


val takoyaki = oderTakoyaki(isKarashiMayo = true, isPutAonori = false)
//Vous pouvez donner un nom d'argument formel à l'appelant
//Intention de code facile à lire


val takoyaki = oderTakoyaki(isPutAonori = false, isKarashiMayo = true)
//Si vous lui donnez un nom, il n'est pas nécessaire qu'il soit dans l'ordre défini dans la fonction.

Argument par défaut

Je pense qu'il existe de nombreuses classes qui ont de nombreuses surcharges avec différents nombres d'arguments. Par exemple ...

En utilisant les arguments par défaut dans Kotlin, vous pouvez éviter une telle situation où les variations augmentent.

/*
 *Je commanderai du takoyaki
 *
 * @param isKarashiMayo Choix de la mayonnaise Karashi
 * @param isPutAonori Mettre ou non de la colle bleue
 *
 * @return Une instance de Takoyaki est retournée
 */
fun oderTakoyaki(isKarashiMayo: Boolean = false, isPutAonori: Boolean = true): Takoyaki {
    // ...
}

//Les arguments peuvent être omis au moment de l'appel. Si omis, la valeur par défaut est utilisée.
val takoyaki = oderTakoyaki()

Fonction d'extension

Vous pouvez ajouter des fonctions aux classes existantes ultérieurement. Ajoutons une fonction au type String qui analyse dans notre propre format de date.

fun String.toDate(): Date {
    val format = SimpleDateFormat("aaaa année MM mois jj jour")
    return format.parse(this)
}

val str = "09 mars 2019"
val date = str.toDate()

fun ʻextended type .function name (ʻargument list): return value Définir comme ↑. Au fait, la fonction habituelle est ... fun function name (ʻargument list): return type` ↑ C'était comme ça. Si vous ajoutez «type de cible d'extension» avant «nom de fonction», cela devient une fonction d'extension.

À propos, cet objet cible d'extension est appelé ** objet récepteur ** dans Kotlin.

Fonction d'expression unique

Si la fonction se compose d'une seule expression, le «{}» peut être omis. Les fonctions d'expression unique peuvent également omettre le type de retour si le type de retour peut être déduit.

//Fonction normale
fun double(x: Int): Int {
    return x * 2
}

//Décrit comme une fonction d'expression unique
fun double(x: Int): Int = x * 2

//Inférer le type de retour avec une seule fonction d'expression
fun double(x: Int) = x * 2

Style Lambda

L'expression lambda s'écrit ↓.

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

{ʻArgument list-> Body} Ou s'il n'y a pas d'argument {Corps principal`} Ce sera.

La variable implicite ʻit` peut être utilisée si l'expression lambda a un paramètre.

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

Le type de fonction est décrit comme suit. (ʻArgument type) -> Type de retour`

fonction en ligne

L'expression Lambda est un mécanisme à coût d'exécution élevé. L'expression lambda de Kotlin est implémentée en tant que classe anonyme. Chaque fois qu'une expression lambda qui capture une variable est exécutée, une instance de la classe anonyme est créée.

C'est donc une fonction en ligne. La fonction en ligne est compilée en remplaçant le corps de la fonction où elle est appelée.

inline fun edit(context: DataBaseContext, block: (DataBaseContext.Transaction)->Unit) {
    val transaction = context.beginTransaction() // 1.Début de la transaction
    block(transaction) // 2.Argument d'exécution lambda
    transaction.commit() // 3.Fin de transaction
}

La fonction en ligne est efficace Une fonction qui prend une expression lambda comme argument et l'exécute en interne. La fonction en ligne étend également l'argument expression lambda à l'appelant.

Ceci est un exemple qui appelle la fonction en ligne Ueno ʻedit`.

val dataBaseContext = DataBaseContext()

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

La fonction ʻedit` est développée au moment de la compilation et ressemble au code suivant (image)

val dataBaseContext = DataBaseContext()

//La fonction d'édition se développe à partir d'ici
val transaction = dataBaseContext.beginTransaction() // 1.Début de la transaction
val newObject = Any() // 2.Argument expansion lambda
transaction.add(newObject) // 2.Argument expansion lambda
transaction.commit() // 3.Fin de transaction
//La fonction d'édition se développe jusqu'à présent

Un autre en ligne entre en jeu

Les génériques Kotlin perdent les informations de type au moment de l'exécution.

Par exemple, la fonction suivante entraînera une erreur de compilation.

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

En effet, le paramètre de type «T» de la fonction «mapFilter» est perdu au moment de l'exécution. Par conséquent, ajoutez le modificateur reified à la fonction en ligne.

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

En faisant cela, il sera développé tout en conservant les informations de type au moment de l'exécution. La fonction mapFilter peut maintenant être compilée.

Recommended Posts

Fonctions Kotlin et lambdas à envoyer aux développeurs Java
Fonctions de portée Kotlin à envoyer aux développeurs Java
Classe Kotlin à envoyer aux développeurs Java
Kotlin's Class part.2 à envoyer aux développeurs Java
Premiers pas avec Kotlin à envoyer aux développeurs Java
Je veux implémenter diverses fonctions avec kotlin et java!
La sécurité Null de Kotlin à envoyer aux développeurs Java
Je veux faire des transitions d'écran avec kotlin et java!
J'ai essayé de résumer les bases de kotlin et java
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Différences entre Java "débutant" et Kotlin
Génériques Kotlin pour les développeurs Java
[Android] Convertir le code Java Android en Kotlin
Je veux revenir à l'écran précédent avec kotlin et java!
Remarques sur la création de l'environnement de développement de Kotlin et la migration de Java vers Kotlin
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
Conversion entre Kotlin nullable et Java facultative
Relation entre les modificateurs d'accès kotlin et java
Convertir toutes les applications Android (Java) en Kotlin
Implémentation Java pour créer et résoudre des labyrinthes
[Pour les débutants] Différence entre Java et Kotlin
[Java] Comment sortir et écrire des fichiers!
Un ingénieur Java a comparé Swift, Kotlin et Java.
Introduction à kotlin pour les développeurs iOS ⑥ ー création de kotlin
Java: Comment envoyer des valeurs du servlet au servlet
Conseils d'interopérabilité avec Kotlin à envoyer aux développeurs Java
[Introduction à Java] À propos des déclarations et des types de variables
Introduction à kotlin pour les développeurs iOS ④-type
Mémo pour la migration de Java vers Kotlin
De Java à C et de C à Java dans Android Studio
Résumé des bons points et des précautions lors de la conversion de l'application Java Android vers Kotlin
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Instruction de commutation Java et pause, Kotlin lorsque l'expression ...
Présentation de Kotlin à un projet Java Maven existant
Je souhaite envoyer un e-mail en Java.
Migrer de Java vers Kotlin côté serveur + Spring-boot
Essayez d'intégrer Ruby et Java avec Dapr
Charger et télécharger des notes en Java sur le stockage Azure
Paramètres initiaux pour la réécriture de projets Java sur Kotlin
Introduction à kotlin pour les développeurs iOS ⑤-XML pratique
Comment obtenir et étudier Java SE8 Gold
Introduction à kotlin pour les développeurs iOS ③-À propos de gradle
Java 8 pour démarrer maintenant ~ for Each et expression lambda ~
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
Introduction à kotlin pour les développeurs iOS ①-Construction de l'environnement
Où les programmeurs Java ont tendance à trébucher sur Kotlin
Introduction à kotlin pour les développeurs iOS ②-Création de projet
Comment écrire Java String # getBytes dans Kotlin?
Ce que des personnes inexpérimentées en Java ont fait pour étudier Kotlin
Comment accéder aux méthodes et champs Java Private
[Java] Comment utiliser la classe Calendar et la classe Date
Fonctions et méthodes
[Java] Introduction à Java
Java et JavaScript
XXE et Java
Introduction à Java
Comment appeler des fonctions en bloc avec la réflexion Java
Maîtriser Kotlin ~ Convertir un fichier Java en fichier Kotlin Road to Graduation ~ Partie 3
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin