Leçon 2: Les
fonctions
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 1
Plan
Leçon 2: Les fonctions
○ Programmes Kotlin
○ (Presque) tout a une valeur
○ Fonctions en Kotlin
○ Fonctions compactes
○ Lambdas et fonctions d'ordre supérieur
○ Filtres de listes
○ Récapitulatif
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 2
Programmes Kotlin
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 3
Mise en place
Pour écrire du code et exécuter des programmes, Il faut :
● Créer un fichier dans le projet
● Créer la fonction main()
● Fournir des arguments à main()(Optionnel)
● Utilisez les arguments passés lors des appels de fonctions
(Optionnel)
● Exécuter le programme
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 4
Créer un nouveau fichier Kotlin
Dans le panneau Projet d'IntelliJ IDEA, sous Hello World, faites un clic droit sur le
dossier src.
● Selectionner New > Kotlin File/Class.
● Selectionner File, nommer le fichier Hello, et cliquer sur Enter.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 5
Créer un fichier Kotlin
Un fichier [Link] est créé dans le dossier src.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 6
Création de la fonction main()
main() est le point d’entrée pour l’exécution d’un programme Kotlin.
Dans le fichier [Link] :
fun main(args: Array<String>) {
println("Hello, world!")
}
Les arguments de la fonction main()sont optionnels.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 7
Exécuter un programme Kotlin
Pour exécuter un programme, il suffit de cliquer sur l’icône ( ) à gauche de
main().
IntelliJ IDEA runs the program, and displays the results in the console.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 8
Fournir des arguments à main()
Selectionner Run > Edit Configurations pour ouvrir la fenêtre Run/Debug
Configurations.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 9
Utiliser des arguments pour main()
Utiliser args[0] pour accéder au premier paramètre fourni à main().
fun main(args: Array<String>) {
println("Hello, ${args[0]}")
}
⇒ Hello, Kotlin!
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 10
(Presque) tout a une valeur
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 11
(Presque) Tout est expression
En Kotlin, presque tout est une expression et a une valeur. Même une expression
if a une valeur.
val temperature = 20
val isHot = if (temperature > 40) true else false
println(isHot)
⇒ false
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 12
Valeurs d’expression
Parfois, la valeur d’une expression est [Link].
val isUnit = println("Ceci est une expression")
println(isUnit)
⇒ Ceci est une expression
[Link]
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 13
Fonctions en Kotlin
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 14
A propos des fonctions
● Un bloc de code qui exécute une tâche spécifique.
● Divise un programme en petits modules.
● Déclarée en utilisant le mot-clef fun
● Peut accepter des arguments avec des valeurs nommées
ou par défaut.
15
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin
Les parties d'une fonction
Fonction qui affiche "Hello World".
fun printHello() {
println("Hello World")
}
printHello()
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 16
Fonctions retournant Unit
Si une fonction ne renvoie aucune valeur utile, son type de retour est Unit.
fun printHello(name: String?): Unit {
println("Hi there!")
}
Unit est un type avec une valeur unique : Unit.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 17
Fonctions retournant Unit
La déclaration du type de retour Unit est optionnelle.
fun printHello(name: String?): Unit {
println("Bonjour tout le monde!")
}
Est équivalent à :
fun printHello(name: String?) {
println("Bonjour tout le monde!")
}
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 18
Les arguments de fonction
Une fonction peut avoir :
● Des paramètres par défaut
● Des paramètres requis
● Des paramètres nommés
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 19
Paramètres par défaut
Les valeurs par défaut fournissent une alternative si aucune valeur de paramètre
n'est passée.
fun drive(speed: String = "fast") {
println("driving $speed")
}
Utiliser "=" après le type pour
définir des valeurs par défaut
drive() ⇒ driving fast
drive("slowly") ⇒ driving slowly
drive(speed = "turtle-like") ⇒ driving turtle-like
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 20
Paramètres requis
Si aucune valeur par défaut n'est spécifiée pour un paramètre, l'argument
correspondant est requis.
Paramètres requis
fun tempToday(day: String, temp: Int) {
println("Today is $day and it's $temp degrees.")
}
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 21
Paramètres par défaut vs paramètres requis
Les fonctions peuvent avoir un mélange de paramètres par défaut et de
paramètres requis.
fun reformat(str: String,
divideByCamelHumps: Boolean,
wordSeparator: Char, A une valeur par
normalizeCase: Boolean = true){ défaut
Passez les arguments requis.
reformat("Aujourd'hui est un jour différent.", false, '_')
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 22
Arguments nommés
Pour améliorer la lisibilité, utilisez des arguments nommés pour les arguments
requis.
reformat(str, divideByCamelHumps = false, wordSeparator = '_')
Il est conseillé de placer les arguments par défaut après les arguments
positionnels, afin que les appelants n'aient qu'à spécifier les arguments requis.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 23
Fonctions compactes
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 24
Fonctions à expression unique
Les fonctions compactes, ou fonctions à expression unique, rendent votre code
plus concis et lisible.
fun double(x: Int): Int { Version complète
x * 2
}
fun double(x: Int):Int = x * 2 Version compacte
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 25
Les lambdas et les fonctions
d'ordre supérieur
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 26
Les fonctions en Kotlin sont de première classe
● Les fonctions en Kotlin peuvent être stockées dans des
variables et des structures de données.
● Elles peuvent être passées en tant qu'arguments à d'autres
fonctions d'ordre supérieur et en être retournées.
● Vous pouvez utiliser des fonctions d'ordre supérieur pour créer
de nouvelles fonctions "intégrées« (built-in).
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 27
Fonctions Lambda
Lambda est une expression qui crée une fonction sans nom.
Paramètres et type
Flèche de
var dirtLevel = 20 fonction
val waterFilter = {level: Int -> level / 2}
println(waterFilter(dirtLevel))
⇒ 10 Code à exécuter
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 28
Syntaxe pour les types de fonction
La syntaxe de Kotlin pour les types de fonction est étroitement liée à sa syntaxe
pour les lambdas. Déclarer une variable qui contient une fonction.
val waterFilter: (Int) -> Int = {level -> level / 2}
Nom de variable Type de données de la fonction
variable
(type de fonction)
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 29
Les fonctions d'ordre supérieur
Les fonctions d'ordre supérieur prennent des fonctions en paramètres ou
renvoient une fonction.
fun encodeMsg(msg: String, encode: (String) -> String): String {
return encode(msg)
}
Le corps du code appelle la fonction qui a été passée comme deuxième argument
et lui transmet le premier argument.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 30
Les fonctions d'ordre supérieur
Pour appeler cette fonction, Il faut passer une chaîne de caractères et une fonction.
val enc1: (String) -> String = { input -> [Link]() }
println(encodeMsg("abc", enc1))
L'utilisation d'un type de fonction sépare son implémentation de son utilisation.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 31
Passage d'une référence de fonction
L'opérateur :: permet de passer une fonction nommée en tant qu'argument à une
autre fonction.
fun enc2(input:String): String = [Link]()
encodeMessage("abc", ::enc2) Passer une fonction nommée
non une lambda
L'opérateur :: indique à Kotlin que vous passez la référence de la fonction en tant
qu'argument, et que vous n'essayez pas d'appeler la fonction.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 32
Syntaxe d'appel du dernier paramètre
Kotlin préfère que tout paramètre prenant une fonction soit le dernier paramètre.
encodeMessage("acronym", { input -> [Link]() })
Il est possible de passer une lambda en tant que paramètre de fonction sans
l'inclure à l'intérieur des parenthèses.
encodeMsg("acronym") { input -> [Link]() }
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 33
Utilisation des fonctions d'ordre supérieur
De nombreuses fonctions prédéfinies de Kotlin sont définies en utilisant la
syntaxe d'appel du dernier paramètre.
inline fun repeat(times: Int, action: (Int) -> Unit)
repeat(3) {
println("Hello")
}
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 34
Filtres de listes
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 35
Filtres de listes
Obtenir une partie d'une liste en fonction d'une certaine condition.
bright
red red-orange dark red orange saffron
orange
Appliquer filter() dans une liste
Condition: Tout élément contenant
“red”
red red-orange dark red
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 36
Itération à travers les listes
Si une fonction n'a qu'un seul paramètre, vous pouvez omettre sa déclaration et
le "->". Le paramètre est implicitement déclaré sous le nom it.
val ints = listOf(1, 2, 3)
[Link] { it > 0 }
Filter itère à travers une collection, où it est la valeur de l'élément lors de
l'itération. Cela équivaut à :
[Link] { n: Int -> n > 0 } OR [Link] { n -> n > 0 }
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 37
Filtres de listes
La condition du filtre entre accolades{} teste chaque élément pendant la boucle
du filtre. Si l'expression renvoie true l'élément est inclus.
val books = listOf("nature", "biology", "birds")
println([Link] { it[0] == 'b' })
⇒ [biology, birds]
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 38
Filtres avides et paresseux
Évaluation des expressions dans les listes :
● Avide : Se produit indépendamment du fait que le résultat soit
utilisé ou non.
● Paresseuse : Se produit uniquement si nécessaire à
l'exécution.
L'évaluation paresseuse des listes est utile si vous n'avez pas besoin de
l'ensemble du résultat, ou si la liste est exceptionnellement grande et que
plusieurs copies ne peuvent pas tenir en RAM.
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 39
Filtres avides
Les filtres sont avides par défaut. Une nouvelle liste est créée chaque fois que
vous utilisez un filtre.
val instruments = listOf("viola", "cello", "violin")
val eager = [Link] { it [0] == 'v' }
println("eager: " + eager)
⇒ eager: [viola, violin]
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 40
Filtres paresseux
Les séquences sont des structures de données qui utilisent l'évaluation
paresseuse et peuvent être utilisées avec des filtres pour les rendre paresseux.
val instruments = listOf("viola", "cello", "violin")
val filtered = [Link]().filter { it[0] == 'v'}
println("filtered: " + filtered)
⇒ filtered: [Link]@386cc1c4
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 41
Séquences -> listes
Les séquences peuvent être converties en listes en utilisant toList().
val filtered = [Link]().filter { it[0] == 'v'}
val newList = [Link]()
println("new list: " + newList)
⇒ new list: [viola, violin]
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 42
Autres transformations de listes
● map() Effectue la même transformation sur chaque élément et renvoie la liste.
val numbers = setOf(1, 2, 3)
println([Link] { it * 3 })
=> [3, 6, 9]
● flatten() Renvoie une seule liste contenant tous les éléments des
collections imbriquées.
val numberSets = listOf(setOf(1, 2, 3), setOf(4, 5), setOf(1, 2))
println([Link]())
=> [1, 2, 3, 4, 5, 1, 2]
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 43
Récapitulatif
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 44
Récapitulatif
Dans la leçon 2, vous avez appris comment :
● Créer un fichier et la fonction main() et exécuter le programme
● Passer des arguments à la fonction main()
● Utiliser la valeur de retour d’une expression
● Utiliser des arguments par défaut pour les fonctions
● Utiliser des fonctions compactes pour rendre le code plus lisible
● Utiliser des lambdas et des fonctions d'ordre supérieur
● Utiliser des filtres de liste avides (eager) et paresseux (lazy)
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 45
Parcours
Pratiquez ce que vous avez appris en complétant le
parcours:
Leçon 2: Fonctions
This work is licensed under the Apache 2 license.
Apache 2 license
Développement Android avec Kotlin 46