Cet atelier de programmation fait partie du cours Kotlin Bootcamp for Programmers (Formation Kotlin pour les programmeurs). Vous tirerez le meilleur parti de ce cours si vous suivez les ateliers de programmation dans l'ordre. En fonction de vos connaissances, vous pouvez parcourir certaines sections. Ce cours s'adresse aux programmeurs qui connaissent un langage orienté objet et souhaitent apprendre l'Kotlin.
Introduction
Dans cet atelier de programmation, vous allez découvrir les principes de base du langage de programmation Kotlin: types de données, opérateurs, variables, structures de contrôle et variables nulles ou non. Ce cours s'adresse aux programmeurs qui connaissent un langage orienté objet et souhaitent apprendre à utiliser Kotlin.
Plutôt que de créer un exemple d'application, les leçons de ce cours sont conçues pour développer vos connaissances, mais elles ne doivent pas être indépendantes les unes des autres pour vous permettre de parcourir les sections que vous connaissez déjà. Pour les assembler, de nombreux exemples utilisent un thème d'aquarium. Et si vous voulez voir l'histoire complète de l'aquarium, consultez le cours Udacity Kotlin Bootcamp for Programmers.
Ce que vous devez déjà savoir
- Créer un projet dans IntelliJ IDEA
- Comment ouvrir et exécuter du code dans le REPL (Read-Eval-Print Loop) en Kotlin IDEA (Tools > Kotlin > Kotlin REPL)
Points abordés
- Utiliser les types de données, les opérateurs et les variables Kotlin
- Utiliser les valeurs booléennes et les conditions
- Différence entre les variables pouvant être nulles et non variables
- Fonctionnement des tableaux, des listes et des boucles en Kotlin
Objectifs de l'atelier
- Apprendre à utiliser le langage REPL de Kotlin pour apprendre les bases
Dans cette tâche, vous découvrirez les opérateurs et les types dans le langage de programmation Kotlin.
Étape 1: Explorez les opérateurs numériques
- Ouvrez IntelliJ IDEA, si ce n'est pas déjà fait.
- Pour ouvrir le REPL Kotlin, sélectionnez Tools (Outils) >, Kotlin >, et Kotlin REPL (REPL Kotlin).
Comme pour les autres langages, Kotlin utilise +
, -
, *
et /
pour les signes plus, moins, horaires et divisions. Kotlin accepte également différents types de nombres, tels que Int
, Long
, Double
et Float
.
- Saisissez les expressions suivantes dans le REPL. Pour afficher le résultat, appuyez sur
Control+Enter
(Command+Enter
sur un Mac) après chacun d'eux.
1+1 ⇒ res8: kotlin.Int = 2 53-3 ⇒ res9: kotlin.Int = 50 50/10 ⇒ res10: kotlin.Int = 5 1.0/2.0 ⇒ res11: kotlin.Double = 0.5 2.0*3.5 ⇒ res12: kotlin.Double = 7.0
Notez que les résultats des opérations conservent les types d'opérandes. Ainsi, 1/2 = 0, mais 1.0/2.0 = 0.5.
- Essayez des expressions comportant différentes combinaisons de nombres entiers et décimaux.
6*50 ⇒ res13: kotlin.Int = 300 6.0*50.0 ⇒ res14: kotlin.Double = 300.0 6.0*50 ⇒ res15: kotlin.Double = 300.0
- Appelez des méthodes sur les nombres. Kotlin conserve les nombres en tant que rôles primitifs, mais vous permet d'appeler des méthodes sur des nombres comme des objets.
2.times(3) ⇒ res5: kotlin.Int = 6 3.5.plus(4) ⇒ res8: kotlin.Double = 7.5 2.4.div(2) ⇒ res9: kotlin.Double = 1.2
Étape 2: S'entraîner à utiliser des types
Kotlin ne convertit pas implicitement entre les types de nombres. Vous ne pouvez donc pas attribuer une valeur courte directement à une variable longue ni une valeur Byte
à un élément Int
. La conversion implicite des nombres est souvent à l'origine des erreurs des programmes. Vous pouvez toujours attribuer des valeurs de différents types en castant.
- Pour afficher certains des casts possibles, définissez une variable de type
Int
dans le REPL.
val i: Int = 6
- Créez une variable, puis saisissez son nom (voir ci-dessus) suivi de
.to
.
val b1 = i.to
IntelliJ IDEA affiche une liste des réalisations possibles. Cette saisie semi-automatique fonctionne pour les variables et les objets de tout type.
- Sélectionnez
toByte()
dans la liste, puis imprimez la variable.
val b1 = i.toByte()
println(b1)
⇒ 6
- Attribuez une valeur
Byte
à des variables de différents types.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1
val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected
val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected
val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected
- Essayez de les caster pour les devoirs qui ont renvoyé des erreurs.
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1
val i5: String = b2.toString()
println(i5)
⇒ 1
val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0
- Afin de rendre les longues constantes numériques plus lisibles, Kotlin vous permet de placer des traits de soulignement dans les nombres, là où cela est pertinent. Essayez de saisir d'autres constantes numériques.
val oneMillion = 1_000_000 val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010
Étape 3: Découvrir la valeur des types de variables
Kotlin prend en charge deux types de variables: modifiable et non modifiable. Avec val
, vous pouvez attribuer une valeur une seule fois. Si vous tentez de renouveler l'attribution, un message d'erreur s'affichera. Avec var
, vous pouvez attribuer une valeur, puis la modifier plus tard dans le programme.
- Définissez des variables à l'aide de
val
etvar
, puis attribuez-leur de nouvelles valeurs.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned
Vous pouvez attribuer une valeur à fish
, puis lui attribuer une nouvelle valeur, car elle est définie avec var
. Si vous essayez d'attribuer une nouvelle valeur à aquarium
, une erreur s'affiche, car la valeur est définie avec val
.
Le type que vous stockez dans une variable est déduit lorsque le compilateur peut le déduire du contexte. Si vous le souhaitez, vous pouvez toujours spécifier explicitement le type d'une variable à l'aide du format deux-points.
- Définissez certaines variables et indiquez le type explicitement.
var fish: Int = 12
var lakes: Double = 2.5
Une fois qu'un type a été attribué par vous ou le compilateur, vous ne pouvez pas le modifier ou un message d'erreur s'affiche.
Étape 4: Apprenez à connaître les chaînes
En mode Kotlin, les chaînes fonctionnent de la même manière que les chaînes de tout autre langage de programmation utilisant "
pour les chaînes et '
pour les caractères uniques, et vous pouvez concaténer des chaînes avec l'opérateur +
. Vous pouvez créer des modèles de chaîne en les combinant avec des valeurs. Le nom $
variable
est remplacé par le texte représentant la valeur. C'est ce qu'on appelle l'interpolation variable.
- Créez un modèle de chaîne.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
- Créez un modèle de chaîne contenant une expression. Comme dans d'autres langues, la valeur peut être le résultat d'une expression. Utilisez des accolades
{}
pour définir l'expression.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants
Dans cette tâche, vous allez découvrir les valeurs booléennes et les conditions de vérification dans le langage de programmation Kotlin. Comme d'autres langages, Kotlin utilise des valeurs booléennes et des opérateurs booléens tels que "inférieur à", "égal à", etc. (<
, ==
, >
, !=
, <=
, >=
).
- Rédigez une instruction
if
/else
.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
println("Good ratio!")
} else {
println("Unhealthy ratio")
}
⇒ Good ratio!
- Essayez une plage dans une instruction
if
. En langage Kotlin, la condition que vous testez peut également utiliser des plages.
val fish = 50
if (fish in 1..100) {
println(fish)
}
⇒ 50
- Rédigez un
if
comportant plusieurs cas. Pour des conditions plus compliquées, utilisez des opérateurs logiques&&
et||
ou logiques. Comme dans d'autres langues, vous pouvez utiliser plusieurs tickets à l'aide deelse if
.
if (numberOfFish == 0) {
println("Empty tank")
} else if (numberOfFish < 40) {
println("Got fish!")
} else {
println("That's a lot of fish!")
}
⇒ That's a lot of fish!
- Essayez une instruction
when
. Il existe une méthode plus pratique pour écrire cette série d'instructionsif
/else if
/else
en langage Kotlin à l'aide de l'instructionwhen
, qui est semblable à l'instructionswitch
dans d'autres langages. Les conditions d'une instructionwhen
peuvent également utiliser des plages.
when (numberOfFish) {
0 -> println("Empty tank")
in 1..39 -> println("Got fish!")
else -> println("That's a lot of fish!")
}
⇒ That's a lot of fish!
Dans cette tâche, vous allez découvrir les variables pouvant être nulles et non nulles. Des erreurs de programmation impliquant des valeurs nulles ont entraîné de nombreux bugs. Kotlin essaie de réduire les bugs en introduisant des variables non nulles.
Étape 1: En savoir plus sur la possibilité de valeur nulle
Par défaut, les variables ne peuvent pas être null
.
- Déclarez une variable
Int
et attribuez-luinull
.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
- Utilisez l'opérateur"Point d'interrogation"
?
, après le type, pour indiquer qu'une variable peut être nulle. Déclarez une variableInt?
et attribuez-luinull
.
var marbles: Int? = null
Lorsque vous avez des types de données complexes, comme une liste:
- Vous pouvez autoriser la suppression des éléments de la liste.
- Vous pouvez autoriser la liste à être nulle, mais si elle n'est pas nulle, ses éléments ne peuvent pas être nuls.
- Vous pouvez autoriser la suppression de la liste ou des éléments.
Les listes et d'autres types de données complexes sont abordés ultérieurement.
Étape 2: Découvrez le et "?"
Vous pouvez tester null
avec l'opérateur ?
, ce qui vous évite d'écrire de nombreuses instructions if
/else
.
- Écrivez un code plus long pour vérifier si la variable
fishFoodTreats
n'est pasnull
. Déduisez ensuite cette variable.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
fishFoodTreats = fishFoodTreats.dec()
}
- Voyons maintenant la façon de rédiger Kotlin à l'aide de l'opérateur
?
.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
- Vous pouvez également associer des tests de valeur nulle à l'aide de l'opérateur
?:
. Prenons cet exemple:
fishFoodTreats = fishFoodTreats?.dec() ?: 0
Il s'agit d'un raccourci entre fishFoodTreats
si ce n'est pas null
, diminuer et utiliser. Sinon, utilisez la valeur après ?:
, qui est 0. Si fishFoodTreats
est défini sur null
, l'évaluation est arrêtée et la méthode dec()
n'est pas appelée.
Point sur les pointeurs de valeur nulle
Si vous adorez NullPointerExceptions
, Kotlin vous permet de les conserver. L'opérateur d'assertion non nul, !!
(double bang), convertit une valeur en un type non nul et génère une exception si la valeur est null
.
val len = s!!.length // throws NullPointerException if s is null
Dans cette tâche, vous découvrirez des tableaux et des listes, et vous apprendrez à créer des boucles dans le langage de programmation Kotlin.
Étape 1: Créez des listes
Les listes sont un type essentiel en langage Kotlin et sont semblables aux listes dans d'autres langages.
- Déclarez une liste à l'aide de
listOf
et imprimez-la. Impossible de modifier cette liste.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
- Déclarez une liste pouvant être modifiée à l'aide de la fonction
mutableListOf
. Supprimer un élément
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true
La méthode remove()
renvoie true
lorsqu'elle supprime l'élément réussi.
Étape 2: Créez des tableaux
Tout comme les autres langages, Kotlin utilise des tableaux. Contrairement aux listes en langage Kotlin, qui comportent des versions modifiables et immuables, il n'existe pas de version modifiable d'un élément Array
. La taille d'un tableau est fixe. Vous ne pouvez pas ajouter ni supprimer d'éléments, sauf en les copiant dans un nouveau tableau.
Les règles utilisant val
et var
sont les mêmes pour les tableaux et pour les listes.
- Déclarez un tableau de chaînes à l'aide de
arrayOf
. Utilisez l'utilitairejava.util.Arrays.toString()
pour imprimer le tableau.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
- Un tableau déclaré avec
arrayOf
n'a pas de type associé aux éléments. Vous pouvez donc combiner des types, ce qui est utile. Déclarez un tableau avec différents types.
val mix = arrayOf("fish", 2)
- Vous pouvez également déclarer des tableaux avec un seul type pour tous les éléments. Déclarez un tableau d'entiers à l'aide de
intArrayOf()
. Il existe des compilateurs ou fonctions d'instanciation correspondants pour les tableaux d'autres types.
val numbers = intArrayOf(1,2,3)
- Combiner deux tableaux avec l'opérateur
+
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
- Essayez différentes combinaisons de tableaux et de listes imbriqués. Comme dans les autres langues, vous pouvez imbriquer des tableaux et des listes. Autrement dit, lorsque vous placez un tableau dans un tableau, vous possédez un tableau de tableaux, et non un tableau aplati du contenu des deux. Les éléments d'un tableau peuvent également être des listes, et les éléments de listes peuvent être des tableaux.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)
⇒ [[I@89178b4, [Atlantic, Pacific], salmon]
Le premier élément, numbers
, est un Array
. Lorsque vous ne l'utilisez pas pour imprimer le tableau, Kotlin affiche l'adresse au lieu du contenu du tableau.
- L'une des caractéristiques intéressantes de Kotlin est que vous pouvez initialiser des tableaux avec du code au lieu de les initialiser sur 0. Essayez cet exemple:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]
Le code d'initialisation se trouve entre les accolades, {}
. Dans le code, it
fait référence à l'index de tableau, en commençant par 0.
Étape 3: Créez des boucles
Une fois que vous disposez de listes et de tableaux, vous pouvez vous attendre à ce que les éléments apparaissent en boucle.
- Créez un tableau. Utilisez une boucle
for
pour parcourir le tableau et imprimer les éléments.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
print(element + " ")
}
⇒ shark salmon minnow
- En langage Kotlin, vous pouvez lire en boucle les éléments et les index en même temps. Essayez cet exemple:
for ((index, element) in school.withIndex()) {
println("Item at $index is $element\n")
}
⇒ Item at 0 is shark Item at 1 is salmon Item at 2 is minnow
- Essayez différentes tailles et plages d'étapes. Vous pouvez spécifier des plages de nombres ou de caractères par ordre alphabétique. Dans une autre langue, il n'est pas nécessaire d'avancer de 1. Vous pouvez revenir en arrière en utilisant
downTo
.
for (i in 1..5) print(i)
⇒ 12345
for (i in 5 downTo 1) print(i)
⇒ 54321
for (i in 3..6 step 2) print(i)
⇒ 35
for (i in 'd'..'g') print (i)
⇒ defg
- Essayez quelques boucles. Comme d'autres langages, Kotlin utilise
while
boucles,do...while
boucles, et les opérateurs++
et--
. Kotlin possède égalementrepeat
boucles.
var bubbles = 0
while (bubbles < 50) {
bubbles++
}
println("$bubbles bubbles in the water\n")
do {
bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")
repeat(2) {
println("A fish is swimming")
}
⇒ 50 bubbles in the water 49 bubbles in the water A fish is swimmingA fish is swimming
Kotlin est très semblable aux autres langages de programmation, mais il présente quelques différences importantes, comme les opérateurs, les listes et les boucles.
Les fonctionnalités suivantes peuvent être différentes de celles en langage Kotlin.
- Les types Kotlin ne peuvent pas être convertis implicitement. Utilisez la diffusion.
- Les variables déclarées avec
val
ne peuvent être attribuées qu'une seule fois. - Par défaut, les variables Kotlin ne peuvent pas avoir la valeur null. Utilisez
?
pour rendre les variables pouvant être nulles. - En langage Kotlin, vous pouvez lire en boucle l'index et les éléments d'un tableau en même temps dans une boucle
for
.
Les structures de programmation Kotlin suivantes sont semblables à celles d'autres langages:
- Les tableaux et les listes peuvent comporter un seul type ou des types mixtes.
- Les tableaux et les listes peuvent être imbriqués.
- Vous pouvez créer des boucles avec
for
,while
,do
/while
etrepeat
. - L'instruction
when
correspond à la version Kotlin' de l'instructionswitch
, maiswhen
est plus flexible.
Documentation Kotlin
Si vous souhaitez en savoir plus sur un sujet de ce cours ou si vous rencontrez des difficultés, https://kotlinlang.org constitue le meilleur point de départ.
- Conversion de type explicite
- Définir des variables
- Modèles de chaîne
- Valeurs nulles
- Listes
- Tableaux
if
,when
,for
etwhile
- Opérateur
?:
(Elvis) - Opérateur
!!
Tutoriels Kotlin
Le site Web https://try.kotlinlang.org propose des tutoriels enrichis appelés Kotlin Koans, un interpréteur Web ainsi qu'une documentation de référence complète avec des exemples.
Cours Udacity
Pour afficher le cours Udacity sur ce sujet, consultez Kotlin Bootcamp for Programmers (Formation Kotlin pour les programmeurs).
IntelliJ IDEA
Consultez la documentation sur IntelliJ IDEA sur le site Web de JetBrains.
Cette section répertorie les devoirs possibles pour les élèves qui effectuent cet atelier de programmation dans le cadre d'un cours animé par un enseignant. C'est à l'enseignant de procéder comme suit:
- Si nécessaire, rendez-les.
- Communiquez aux élèves comment rendre leurs devoirs.
- Notez les devoirs.
Les enseignants peuvent utiliser ces suggestions autant qu'ils le souhaitent, et ils n'ont pas besoin d'attribuer les devoirs de leur choix.
Si vous suivez vous-même cet atelier de programmation, n'hésitez pas à utiliser ces devoirs pour tester vos connaissances.
Répondez à ces questions.
Question 1
Laquelle de ces propositions déclare une liste non modifiable ?
▢ val school = arrayOf("shark", "salmon", "minnow")
▢ var school = arrayOf("shark", "salmon", "minnow")
▢ val school = listOf("shark", "salmon", "minnow")
▢ val school = mutableListOf("shark", "salmon", "minnow")
Question 2
Quelle sera la sortie du code suivant ?for (i in 3..8 step 2) print(i)
▢ 345678
▢ 468
▢ 38
▢ 357
Question 3
À quoi sert le point d'interrogation dans ce code ?var rocks: Int? = 3
▢ Le type de la variable rocks
n'est pas fixe.
▢ La variable rocks
peut être définie sur une valeur null.
▢ La valeur rocks
ne peut pas être nulle.
▢ La variable rocks
ne doit pas être initialisée immédiatement.
Passez à la leçon suivante :
Pour une présentation du cours, y compris des liens vers d'autres ateliers de programmation, consultez le "Kotlin Bootcamp for Programmers: Welcome to the course."