Six compétences de développement Kotlin que vous devez connaître

Prenez l'habitude d'écrire ensemble ! C'est le 13ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .

1. Optimisation de la récursivité de la queue

Habituellement, nous pouvons être confrontés au scénario d'écriture de fonctions récursives, telles que :

fun test5(n: Int): Int =
    if (n == 1) {
        1
    } else
        test5(n - 1)
复制代码

Chaque méthode correspond à un cadre de pile. L'appel récursif de la méthode entraînera une profondeur de pile de méthode trop profonde, et il y a un risque d'OOM. Kotlin fournit 尾递归特性des optimisations :

tailrec fun test5(n: Int): Int =
    if (n == 1) {
        1
    } else
        test5(n - 1)
复制代码

On peut voir que l'optimisation de la récursivité de la queue est à ajouter à la method tailrec, et l'appel de la méthode récursive doit être à la fin de la méthode, décompilez-la en code java pour voir l'effet :

image.png

Vous pouvez voir que le compilateur optimise l'invocation récursive de la méthode.

infix2. Le combat réel de la méthode infixe

La modification de la méthode infix consiste à ajouter infixune déclaration à la méthode, et un seul paramètre de méthode peut être déclaré, par exemple :

infix fun String.a(b: String) = "$this - $b"
复制代码

Expliquons-nous avec un cas :

Nous avons généralement une exigence comme celle-ci :传入文件路径String返回File类型

fun makeFile(parent: String, child: String): File {
    return File(parent, child)
}
复制代码

Il n'y a rien de mal à écrire de cette façon, mais avec la fonction infix, nous pouvons obtenir une encapsulation plus élégante, comme suit :

infix fun String.div(child: String): File = File(this, child)
复制代码

Utilisez comme suit :

fun makeFile(parent: String, child: String): File = parent div child
复制代码

ce qui parent div childéquivaut à File(this, child)la réalisation de .

divCe n'est pas particulièrement élégant à écrire, comme devoir créer des Fileobjets à chaque fois , divc'est trop lourd à écrire, et la lisibilité est trop mauvaise.

Afin de résoudre les deux problèmes ci-dessus, nous pouvons combiner la surcharge d'opérateurs operatorpour une optimisation supplémentaire. Examinons les fonctions courantes de surcharge d'opérateurs et la relation de mappage des opérateurs correspondants :

expression convertir
un + b a.plus(b)
un B a.moins(b)
un B une fois(b)
un B a.div(b)
un B a.mod(b)
un B a.rangeTo (b)

Parmi eux, il y a un opérateur de divsurcharge de fonction /, à l'aide duquel nous transformons la fonction de String en File ci-dessus :

infix operator fun String.div(child: String): File = File(this, child)
复制代码

Ensuite, il peut être utilisé comme ceci :

fun makeFile(parent: String, child: String): File = parent / child
复制代码

Comme on peut le voir ci-dessus, parent / childla création du fichier peut être complétée directement et /la lisibilité est meilleure.

Je suppose que tu aimes

Origine juejin.im/post/7086234211333439519
conseillé
Classement