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 :
Vous pouvez voir que le compilateur optimise l'invocation récursive de la méthode.
infix
2. Le combat réel de la méthode infixe
La modification de la méthode infix consiste à ajouter infix
une 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 .
div
Ce n'est pas particulièrement élégant à écrire, comme devoir créer des File
objets à chaque fois , div
c'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 operator
pour 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 div
surcharge 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 / child
la création du fichier peut être complétée directement et /
la lisibilité est meilleure.