Kotlin Learn
Kotlin Learn
Avant de commencer
• Pas besoin d’Android Studio pour ces sections. Nous irons directement sur la
playground Kotlin à l’adresse: https://play.kotlinlang.org/
1. Sur une seule ligne dans la limite de 100 caractères. Il sera précédé de //
2.Sur plusieurs lignes. Commence par /**, nit par */ et prend une * à chaque
ligne. fi
Les Commentaires
/**
* Salut les codeurs !
* Vous êtes bien sur play.kotlinlang.org
* Pour apprendre le développement d'applications avec Kotlin !
*/
}
Le print
A certains moments du développement, nous devrons utiliser le print ou le println
pour véri er si la donnée que vous voulons est bien présente au moment voulu.
Il en existe 2:
fun main() {
//Création d'une variable avec un nom
var name = "Matthieu"
//véri cation de la variable
println(name)
//Ou
print("Salut, moi c'est $name")
//PS: Cette histoire de $name s'appelle la String interpolation et sera vue un peu plus tard
}
fi
Variables et Constantes
Un des principes de base en programmation est la notion de variable. C’est un espace de stockage alloué par le
programme pour stocker une donnée unique.
Imaginez plutôt un chier contenant une seule valeur. Ce chier peut être retrouvé par son nom.
Une fois cette valeur stockée, le programme pourra l’utiliser en l’appelant par son nom. Nous pouvons stocker avec
Kotlin plusieurs types de variables. Voici quelques exemples des DataTypes les plus courants et que l’on va nommer
primaires:
A noter qu’il existe aussi les array et dictionnaires , ce sont des Listes ordonnées ou non de classes ou types. Ce ne
sont pas des DataType primaires mais seront aussi stockés en variables.
fi
fi
fi
Instancier une variable
Une variable ou une constante se dé nissent et se créent avec 4 paramètres:
Ensuite, pour récupérer la variable, nous n’aurons qu’a appeler le nom de celle-
ci
fi
Instancier une variable
fun main() {
Voici un exemple. Vous pouvez voir les 4 var name: String = "Matthieu"
étapes pour créer des variables et val age: Int = 27
constantes di érentes avec di érents val currentBankAccount: Double = 0.45
types. val isKotlinCool: Boolean = true
}
ff
ff
Modifier une variable
Les données dans vos applications seront amenées à changer avec le
temps. Exemple, le nombre de likes sur un post Instagram, un numéro de fun main() {
téléphone, un score de match, une variable dé nissant si nous sommes en var cats = 3
dark ou light mode… println(cats)
cats = 4
Nous avons donc dé ni lors de sa création un valeur initiale, nous pouvons println(cats)
la changer en appelant le nom de cette variable et en lui attribuant une }
valeur de meme type obligatoirement. Sinon nous obtiendrons une erreur.
fun main() {
var cats = 3
Type mismatch: inferred type is String but Int was expected
println(cats)
cats = "Athena" Nous pouvons voir ici un type mismatch. Le type nouvellement
println(cats) attribué ne correspond pas à ce qui a été attendu !
}
fi
fi
Différence entre variable et constante
Quand avec une variable la valeur peut varier, avec une constante, la valeur ne
peut pas être réassignée, la valeur reste xe, constante
fun main() {
val cats = 3
println(cats)
cats = 4
println(cats)
}
Val cannot be reassigned
• Le nom doit être explicite ex: âge pour une variable stockant l’âge
• Pas d’espace
fun main() {
val cats = 3
val age = 27
var currentTemperature: Int = -12
}
Les nombres entiers: les autres
Int est le nombre entier basique. Il est recommandé dans la plupart des cas. Cependant il est à
mon sens important de connaitre les autres types de nombres entiers même si vous les utiliserez
surement très peu:
Il est sur 64bits avec une précision de 15-16 valeurs après la virgule.
fun main() {
val averageCourseStars: Double = 4.5
}
Les nombres Décimaux: Float
Moins précis que le Double, il a che une précision après la virgule de 6-7
digitales.
Il nit par F.
Nous utiliserons cependant le Double plus souvent, tout comme nous avons
privilégié le Int pour les entiers.
fun main() {
val averageCourseStars: Float = 4.5F
}
fi
ffi
String: Chaine de caractères
Il s’agit certainement du type le plus répandu dans une application. Quelle
application ne possède aucun texte? Très peu. D’ailleurs, dans une application
classique, un nombre visible à l’écran est en fait intégré à un texte, comme
nous l’avons fait avec la string interpolation dans le print !
fun main() {
val name: String = "Matthieu"
val description = "J'essaie d'enseigner au plus grand monde le développement d'applications mobiles"
val fakeNumber = "3"
}
fi
String: Chaine de caractères
On parle de String en tant que chaîne de fun main() {
caractères et non pas de texte tout simplement. val name: String = "Matthieu"
for (character in name) {
En e et, il existe un type Character, nous println(character)
pouvons grâce aux boucles accéder à tous les }
caractères d’une String. }
fun main() {
val name: String = "De la Tour"
val surname = "Jean Charles"
Ne pas oublier l’espace pour ne pas avoir
val fullName = surname + " " + name
print(fullName)
les 2 valeurs accolées
}
String: Interpolation ou templates
Interpolation ou template permet d’ajouter des valeurs non String à une String. Nous pouvons bien
sur aussi ajouter des Strings en interpolation
fun main() {
val name: String = "Marseille"
val arr: Int = 16
println("$name possède $arr arronndissements")
println("Il y a ${name.length} lettres dans $name")
J’ai intégré le .lenght pour mesurer le nombre de caractères dans la String. C’est un
concept à apprendre que l’on verra surtout dans les Listes.
String: Caractères spéciaux
Dans une String, vous pourrez aisément faire un saut de ligne avec \n.
fun main() {
val jump: String = "Salut, je vais sauter à la ligne\nHopla"
println(jump)
}
Vous avez compris que les guillemets ouvrent et ferment une String. Et si il y
avait des guillemets dans le texte que vous ajoutez ? \ avant le guillemet
dans le texte vous permettra d’échapper à la n de la String et de pouvoir
continuer sereinement
fun main() {
val quote: String = "Socrate a dit: \"Tout ce que je sais, c'est que je ne sais rien\""
println(quote)
}
fi
Boolean: Vrai ou Faux?
Passons désormais aux Booleans. C’est simplement une valeur qui est vraie ou
fausse. Les 2 seules valeurs sont true ou false.
Elle servira à:
Avec Kotlin nous avons Pair pour une paire de valeurs et Triple pour 3 valeurs.
fun main() {
val (code, description) = Pair(404,"Page not found")
println(code)
println(description)
}
fi
Pair et Triple
Pour le Triple, cela fonctionne de la meme façon mais avec 3 valeurs. A noter
que pour le Pair comme le Triple, nous pouvons ajouter des Types à chaque
valeur entre <>
fun main() {
val (red, green, blue) = Triple<Int, Int, Int>(123, 45, 35)
print(red)
}
Array
L’array est la façon la plus simple pour grouper un ensemble de valeurs de
même Type au sein de votre programme.
Prenez par exemple une liste d’utilisateurs, une liste de résultats, une liste de
publications. C’est extrêmement courant dans des applications même
basiques.
fun main() {
var boys = arrayOf<String>("Jean", "Michel", "Jacques", "John")
var girls = arrayOf<String>("Marie", "Myriam", "Sonia", "Cindy", "Helena")
//Ajouter
boys += "Georges"
println(boys.asList())
//Concatener
var fullClass = boys + girls
println(fullClass.asList())
}
ffi
fi
Array: L’index
Dans les Array, on peut accéder à un élément précis en utilisant l’index. Attention, en
programmation, l’index commence toujours à Zéro. Le premier élément est donc 0, quand au
dernier il sera… size - 1.
fun main() {
var girls = arrayOf<String>("Marie", "Myriam", "Sonia", "Cindy", "Helena")
}
List
Vous l’avez vu, les Array ont certaines limitations, pour lire l’intérieur d’un array,
on l’avait mis en toList(). Voyons donc maintenant les Listes. Nous en avons 2:
1. listOf: C’est une Liste en read-only. C’est à dire qu’à l’instar de arrayOf, on
ne pourra pas ajouter ou supprimer de données sans recréer la variable
entière. Elle a cependant plus de possibilités qu’un array
2.mutableListOf: Ici, elle peut muter, nous pouvons donc ajouter et supprimer
des éléments de cette liste facilement
listOf
Voyons ce que nous pouvons faire avec un listOf:
fun main() {
var n Players = listOf<String>("Brady", "Kamara", "Kupp", "Garropolo", "Mahomes", "OBJ", "Kittle", "Kelce",
"Bosa")
}
fl
fl
fl
fl
fl
fl
mutableListOf
fun main() {
var n Players = mutableListOf<String>("Brady", "Kamara", "Kupp", "Garropolo", "Mahomes", "OBJ", "Kittle", "Kelce", "Bosa")
}
fl
fl
fl
fl
fl
fl
fl
fl
fl
fl
fi
fi
Map
Aussi appelée dictionnaires, les Maps sont des collections tout comme les listes
et les array mais qui contiennent des clés et des valeurs.
Les clés (Keys) sont uniques alors que les valeurs (values) peuvent être en
doublons.
1.mapOf
2.mutableMapOf
Map
Nous allons nous focaliser sur les mutable, car la logique est exactement la même excepté l’ajout
et la suppression spéci que à la mutable. Comme pour les listes:
Ici la key sera le prénom et la valeur la note. Notez le mot clé to pour dé nir une valeur à la clé ainsi
que la virgule séparant chaque élément. Nous aurions pu mettre tout ceci sur une seule ligne.
fi
fi
Map
Voyons ce que nous pouvons faire d’autre avec la map:
fun main() {
var classroomResults = mutableMapOf( "Johnny" to 12, "Quentin" to 15, "Sophie" to 11, "Axel" to 7, "Candice" to 17)
//Voir la map
println(classroomResults)
//Accéder à un élément selon sa clé
println(classroomResults["Axel"])
//Compter
println(classroomResults.size)
//Modi er une valeur selon la clé
classroomResults["Sophie"] = 19
println(classroomResults)
//Ajouter: Notez que c'est exactement comme modi er une valeur
//Si la clé n'existe pas elle est créée
classroomResults["Mika"] = 5
println(classroomResults)
//Supprimer
classroomResults.remove("Quentin")
println(classroomResults)
}
fi
fi
Nullable
Il est certain que vous tomberez un jour ou l’autre sur cette valeur: null !
Cela signi e que la variable ne contient aucune valeur et que cette valeur est donc nulle. Dans les
langages de programmation récents, le concept de null-safety est souvent utilisé. Cela signi e
que si le programme obtient une valeur nulle sur une variable devant posséder une valeur le
programme va crasher. Problématique…
C’est pourquoi nous pouvons dé nir nos types comme nullable, pouvant avoir une valeur nulle et
ainsi éviter le crash.
Ici par exemple, nous avons assigné null à la variable, la playground s’est arrêtée avec une erreur
fun main() {
var name: String = "Geoffrey"
println(name)
name = null
println(name)
}
fi
fi
fi
Nullable
Dans ce cas, nous allons ajouter le ? Derrière le type. Cela dira au
programme, attention il est possible qu’il n’y ait aucune valeur ici.
fun main() {
var name: String? = "Geoffrey"
println(name)
name = null
println(name)
}
Nous verrons dans le chapitre sur les conditions comment « déballer un nullable »
Les
Opérateurs
Définition
Un opérateur est un symbole spécial qui permet de véri er, modi er ou combiner des valeurs. Nous avons déjà
utilisé un opérateur: le symbole ‘=‘ pour attribuer ou modi er la valeur d’une variable.
Les opérateurs peuvent être classés en plusieurs catégories. Chaque catégorie sera vue en détail dans les
sections suivantes:
• L’opérateur d’assignation.
• Les Opérateurs unaires opérent sur une cible unique. Ce sont soit des unaires pré xes si l’opérateur est
placé immédiatement avant la valeur (-valeur) ou des unaires su xes si l’opérateur est placé immédiatement
après la valeur(valeur!).
• Les opérateurs binaires opèrent sur 2 cibles. L’opérateur est donc placé entre les 2 cibles (valeur1 + valeur2)
fi
fi
ffi
fi
fi
L’opérateur d’assignation
Nous avons déjà vu à plusieurs reprises cet opérateur. C’est le signe =. Il sert à
assigner ou modi er la valeur d’une variable.
fun main() {
//Assignation d'une variable
var myVariable = 3
•Le Moins
• L’inversion
• L’incrémenteur
• Le décrémenteur
fun main() {
var positive = 3
var negative = -45.6
println(-positive)
println(-negative)
}
L’opérateur unaire: !
Son rôle est de changer une valeur cette fois ci non pas d’un nombre mais d’un
Booléen.
fun main() {
var isKotlinCool = true
println(!isKotlinCool)
}
L’opérateur unaire: ++ & - -
On retourne sur les nombres pour incrémenter cette fois ci. Le ++ placé derrière
une variable numérique l’incréméntera de 1 unité
fun main() {
var number = 3
number++
println(number)
number--
println(number)
}
Les opérateurs arithmétiques
Ce sont les opérateurs qui permettent d’e ectuer des calculs. Ils sont placés
entre 2 valeurs pour donner un résultat:
• Float pour un calcul entre Int et Float val resultFloat: Float = numberB - numberC.toFloat()
println(resultFloat)
• Double pour un calcul comprenant un }
Double
Mais si on veut forcer le Type d’un résultat on obtient une erreur: Par exemple on
ne peut pas forcer un Int être le résultat entre un Int et un Double. Pour ceci, on
va devoir les convertir en utilisant toInt() ou toFloat(), ou encore toDouble()
ff
Le Remainder ou Modulo
fun main() {
Une division entre Int et Double donne un résultat val number1 = 13
en Double si le résultat implique une décimale, val number2 = 4
val divInt: Int = number1 / number2
Nous pouvons forcer ce résultat à devenir un Int.
val modulo = number1 % number2
Dans notre cas, 13 divisé par 4 donne 3. Dans ce println(divInt)
calcul, nous avons perdu 1 unité. println(modulo)
}
fi
Opérateurs de Comparaison
fun main() {
var number1 = 13
Nous disposons aussi d’opérateur pour val number2 = 15
comparer. Ces comparaisons nous renverrons println(number1 == number2)
true ou false //false car 13 n'est pas égal à 15
//Ici nous véri ons si les devoirs sont faits et si sa moyenne OU plus de 10
• && pour véri er si tout est val restTime = homeworkDone || average > 10
vrai println(restTime)
}
• || si au moins une condition
est remplie
A noter: isSunday est égal à isSunday == true
fi
fi
fi
Les Fonctions
Définition
Une fonction est en morceau de code encapsulé qui e ectue une tache précise et
ne sera e ectué que quand il sera appelé par son nom. Si une fonction n’est jamais
appelée, alors le code présent à l’intérieur de cette fonction ne sera jamais lancé.
Pour appeler une fonction, on procède de la même façon que pour une variable,
et on ajoute entre parenthèses les valeurs de paramètres si la fonction en
demande.
fun main() {
fun myFirstFunction() {
println("Youpi ! On m'a appelé")
}
myFirstFunction()
}
fi
ff
Les fonctions basiques
Nous allons voir ici les fonctions dites basiques, c’est à dire sans aucune valeur
retournée ni aucun paramètre.
D’ailleurs, une fonction qui ne retourne aucune valeur peut retourner Unit, ce qui
signi e aucune valeur retournée.
fun main() {
fun sayHelloToStudents(): Unit {
println("Salut les apprenants! J'espère que votre formation se passe bien!")
}
sayHelloToStudents()
}
fi
Les fonctions avec paramètres
Nous avons déjà sans nous en rendre compte utilisé une fonction avec
paramètre, le println.
Nous ajoutons donc entre les parenthèse une valeur de type demandé. Pour
créer cette fonction, nous donnerons un nom au paramètre et un type. La valeur
entrée servira de constante au sein des accolades
fun main() {
fun sayHelloTo(name: String): Unit {
println("Salut $name")
}
sayHelloTo("Marie")
sayHelloTo("Pierre")
}
Les fonctions avec paramètres
Nous pouvons évidemment utiliser plusieurs paramètres et aussi dé nir des valeurs
par défaut si aucune valeur est entrée. Pour cela on assignera avec = une valeur.
Cette valeur ne sera utilisée que si la fonction appelée n’a pas initialisé ce paramètre.
Vous pouvez donc voir dans l’exemple que cher inconnu sera mis si aucun paramètre
n’est entré.
fun main() {
fun sayHelloTo(name: String = "Cher inconnu"): Unit {
println("Salut $name")
}
sayHelloTo("Marie")
sayHelloTo()
fi
Montrer le nom des paramètres
A certains moments, vous voudrez montrer les noms de paramètres, que ce soit
pour les utiliser dans un ordre di érent, en omettre avec valeur par défaut ou
autre… Pour ceci nous pouvons utiliser le nom du paramètre suivi de =
Vous pouvez voir que soit des paramètres ont été omis, ou que d’autres ont été
inversés
fun main() {
fun introduction(name: String = "Inconnu", age: Int = 18) {
val greetings = "Salut je m'appelle $name et j'ai $age ans."
println(greetings)
}
introduction(name = "Matthieu")
introduction(age = 34, name = "Yannis")
}
ff
Les fonctions avec retour
Et si nous voulions retourner une valeur? A la place du :Unit, nous ajoutons le type de valeur à
retourner et le code de la fonction devra donc obligatoirement retourner une valeur du type
demandé grâce au mot clé return.
A noter que apres le retour de type, le code suivant ne sera pas appelé.
Il ne reste ensuite qu’a assigner ce retour à une variable
fun main() {
fun introductionWithReturn(name: String = "Inconnu", age: Int = 18): String {
return "Salut je m'appelle $name et j'ai $age ans."
}
Il existe plusieurs sortes de boucles, qui chacune vont nous servir à di érents
moments et pour diverses raisons:
ff
For in
Nous avons vu les listes, il serait intérressant de pouvoir itérer, c’est à dire passer à travers chaque valeur.
Une boucle est composée de for puis entre parenthèse le nom de la valeur crée à chaque tout de boucle.
In en tant que mot clé qui dé nit la liste dans laquelle on va itérer:
Le code entre accolades sera e ectué à chaque tour de boucle avec la valeur créée.
fun main() {
val list = mutableListOf(1, 34, 89, 567, 2, 345, 4)
val map = mutableMapOf("Jack" to 4.3, "John" to 7.8, "Simon" to 9.0)
fun main() {
val string = "Essayez de passer à travers tous mes caractères"
fun main() {
for (index in 0..13) {
println("Je suis l'index $index")
}
}
Le Int de départ sera 0, la boucle s’arrêtera lorsque index sera égal à 13. A chaque fois le code
entre accolades sera effectué.
fi
fi
For in avec indices
Maintenant nous allons mixer les 2. Nous allons passer à travers une liste via l’index. Rappel l’index
commence à zéro et nit à size -1.
fun main() {
val list = mutableListOf(1, 34, 89, 567, 2, 345, 4)
for (index in 0..list.size - 1) {
println(list[index])
}
}
En nissant par list.size, nous obtenons une erreur car nous sommes allés trop loin. Mais il y a encore plus simple: En utilisant
list.indices qui donne l’index de départ et l’index de n automatiquement
fun main() {
val list = mutableListOf(1, 34, 89, 567, 2, 345, 4)
for (index in list.indices) {
println(list[index])
}
}
fi
fi
fi
For in withIndex
Allez une dernière elle mélange les 2 façons de passer à Travers une liste en obtenant à la fois
l’index mais aussi la valeur qui correspond:
fun main() {
val list = mutableListOf(1, 34, 89, 567, 2, 345, 4)
for ((index, value) in list.withIndex()) {
println("L'$index est $value")
}
}
While
While va faire une boucle tant qu’une condition n’est pas remplie. Essayons
d’incrémente cet int jusqu’ ce qu’il arrive à 13. Il n’e ectue la boucle que
jusqu’a 12. Ensuite il en sort car la condition est remplie.
Attention si vous n’incrémentez pas, vous entrez dans une boucle in nie !
fun main() {
var int = 0
while (int < 13) {
println(int)
int++
}
println("$int C'est Marseille bébé")
}
ff
fi
Do While
Do while ressemble à sa soeur, à l’exception qu ‘elle e ectue la boucle avant de véri er la
condition. Ce qui signi e que si la condition est remplie au départ, nous auront un tour
gratuit !
fun main() {
var int = 82
do {
println(int)
int++ }
while (int < 13)
println("$int C'est Marseille bébé")
}
fi
ff
fi
Les
Conditions
Définition
Au cours du développement de vos applications, vous serez amenés à exécuter
certaines portions de code selon certaines conditions.
• La condition if /else
• la condition when
fi
If
If qui se traduit par si en français permet d’e ectuer une portion de code suivant les
accolades si la condition est remplie, c’est à dire si la condition renvoie true. La
condition devra se trouver entre parenthèses. A noter que nous avons déjà vu les
conditions dans un chapitre précedent:
fun main() {
val isSunny = true
if (isSunny) {
println("On est partis pour la playa")
}
}
fun main() {
val isSunny = false
if (isSunny) {
println("On est partis pour la playa")
} else {
println("Bon on reste à la maison, il y a du MarioKart")
}
}
If …else if …else
Tout n’est pas binaire dans ce monde, ce n’est pas que si sinon, mais plutôt si, sinon si, sinon. N’est-ce
pas? Nous pouvons donc intégrer de nombreux cas, comme par exemple les di érentes limites de
vitesse sur route:
fun main() {
val speedLimit = 75
ff
when
Plus nous avons de conditions, et plus nous rentrons dans un code complexe. When
nous permet de simpli er cela en proposant des cas précis.
Chaque cas sera énuméré avec le code à e ectuer suivant la èche. Si on entre dans
aucun cas, on tombe dans le else:
fun main() {
val language = "Grec"
when (language) {
"Francais" -> println("Bonjour")
"Espagnol" -> println("Hola")
"Italien" -> println("Buongiorno")
"Grec" -> println("Kalimera")
else -> println("Hello")
}
}
fi
ff
fl
Déballer un optionnel
Lorsque l’on utilise un nullable ou optionnel, on veut prévenir les crash au cas
ou une valeur serait nulle.
• If / else
• Not null assertion
• Elvis (Oui oui Elvis)
Déballer un optionnel
Avant toute chose, nous pouvons même si une variable est optionnelle accéder
à ses propriétés grâce au ?. Cela ne les déballera pas, mais nous aurons accès
à toutes ses propriétés qui resteront optionnelles.
fun main() {
var name: String? = "Jean"
val count = name?.length
println(count)
}
fun main() {
var name: String? = "Jean"
if (name != null) {
val size = name.length
} else {
println("C'est une variable nulle")
}
}
fun main() {
var name: String? = "Jean"
val size = name!!.length
println(size)
}
Avant de créer val size… mettez name sur null et regardez ce qu’il se passe … Un crash. Ce que
l’on souhaite éviter.
Déballer un optionnel: Elvis
Il est le King du Rock & du nullables. Je veux parler de Elvis ! Alors pourquoi Elvis?
C’est une déformation de else if !
Apres ?: se trouvera une valeur pas défaut sur notre nullable est e ectivement null
fun main() {
var name: String? = "Jean"
val size = name?.length ?: 35
println(size)
}
ff
Extra: if else sur une seule ligne
Au lieu d’utiliser if/ else avec des accolades et sur plusieurs lignes vous pouvez
vous en servir sur une seule. Ne fonctionne pas avec le else if car cela
deviendrait trop complexe et peu lisible
fun main() {
//sur un Bool
val isSunny = false
val message = if (isSunny) "Tous à la plage" else "Mario Party!"
println(message)
//Sur un nullable
var name: String? = "Jean"
val size = if (name != null) name.length else 83
println(size)
}
Lambdas
Lambda ?
Une expression Lambda est ce que l’on appelle aussi dans d’autres langages une
fonction anonyme.
Elle consiste à proposer dans une syntaxe concise une fonction sans utiliser le mot clé
fun.
Elle fait partie des « Function Litterals » . Ce sont des fonctions nos déclarées mais
passées directement dans une expression
Exemple de syntaxe
fun main() {
val lambda = {
println("Je viens de créer ma première expression Lambda")
}
}
Utiliser une Lambda
Nous avons donc notre premier lambda, pour l’utiliser nous allons directement
l’appeler comme pour une fonction classique
fun main() {
val lambda = {
println("Je viens de créer ma première expression Lambda")
}
lambda()
}
Utiliser une Lambda en tant que Data Type
Honnêtement , il n’y aurait que peu d’intêret à les utiliser de cette façon. Leur utilité
principale se fait en tant que Data type. Nous y ajouterons donc des paramètres et un
type de retour.Comparé aux fonctions, on n’utilisera pas : mais -> pour évoquer le retour
fun main() {
val sayHello: (String) -> Unit = {
println("Salutations $it")
}
sayHello("Marcel")
fun main() {
val sayHello: (String, Int) -> Unit = { name, age ->
println("Salutations $name et j'ai $age ans")
}
sayHello("Marcel", 45)
}
Passer un lambda dans une fonction
Avec Kotlin et particulièrement, le lambdas sont utilisés dans des fonctions. Ils entrent donc comme paramètre
de fonction:
fun main() {
val calculateEra: (Int, Int) -> Int = { width, height ->
width * height
}
Pour créer un objet, nous avons d’abord besoin, à l’image d’un architecte de créer un plan,
un cahier des charges, ou un moule. Ce plan aura entre autre des propriétés, des méthodes
qui seront autant de fonctionnalités que l’on attribuera aux objets. Ce ‘plan’ est une classe.
Une fois ce plan fait, nous pouvons initialiser des objets à l’in ni. Chacun suivant son plan.
Dans une application, la classe peut être écrite dans un chier séparé ou dans un chier
joint à d’autres éléments.
Lorsqu’on parle d’objet, on peut entendre instance de classe. C’est la même chose.
fi
fi
fi
fi
Définir une classe
Nous avions vu les conventions de nomage pour les variables et les constantes. Pour
les classes nous commencerons toujours par une majuscule pour le nom.
class User() {
}
Créer une instance de classe
La classe en elle même n’est qu’un plan d’architecte pour la création d’objets, un
modèle. Pour créer un objet, nous devons créer une variable et instancier cette classe en
utilisant le nom de la class suivi de parenthèses:
fun main() {
}
Ajouter des propiétés
La classe possède des propriétés (variables) et des méthodes (fonctions). Nous pouvons dé nir des propriétés communes à
tous les objets User que nous créons dans le body de la classe.
• Nom
• Prénom
• Age
Car évidemment ce sont les caractéristiques communes à tous les utilisateurs. Voila ce que cela donne:
class User {
val name: String = "Van Houten"
val surname: String = "Bruno"
val age: Int = 25
}
Les valeurs sont « en dur ». On verra comment les modi er plus tard
fi
fi
Accéder aux propriétés
Désormais, notre objet peut accéder aux propriétés nouvellement crées. Pour
ceci, il su t d’appeler le nom de l’instance créée, puis y ajouter un . suivi du
nom de la propriété
fun main() {
fun main() {
//Création de notre instance de classe
val newUser = User()
//Print du nom
println(newUser.name)
//Appel de la méthode
newUser.sayHello()
}
//Méthodes
fun sayHello() {
println("Bonjour tout le monde, je suis $surname $name et j'ai $age ans.")
}
}
Ajouter un constructeur
Jusque la , tous nos objets avaient le même nom et le même prénom. Ce n’est pas ce que l’on voudra pour nos applications. Il est donc
temps d’ajouter un constructeur pour que chaque objet soit unique.
Pour ceci, après le nom de notre classe, des parenthèses nous permettent de construire l’objet. Les propriétés passent donc du body
vers le header.
fun main() {
//Création de notre instance de classe
val zorro = User("De la vega", "Diego", 35)
val bernardo = User(surname = "Bernardo", name = "Sin nombre", age = 47)
//Print du nom
println(zorro.name)
//Appel de la méthode
zorro.sayHello()
bernardo.sayHello()
}
//Méthodes
fun sayHello() {
println("Bonjour tout le monde, je suis $surname $name et j'ai $age ans.")
}
}
Modifier les propriétés
Dans mon constructeur, j’ai dé ni des constantes comme propriétés. Cependant, si on les change
en var, nous pouvons modi er ces valeurs comme nous avons fait avec des variables classiques.
fun main() {
val zorro = User("De la vega", "Diego", 35)
zorro.name = "De la Puente"
zorro.sayHello()
}
//Méthodes
fun sayHello() {
println("Bonjour tout le monde, je suis $surname $name et j'ai $age ans.")
}
}
fi
fi
Privatiser les propriétés
Imaginez que vous ne vouliez pas accéder à certaines propriétés ou méthodes hors de la classe. Pour ceci, il existe le modi er
private. Placé devant le mot clé val, var, class, fun… il ne permet l’accès à ces données que dans la classe dans laquelle il est
contenu.
Par exemple ici, nous ne voulons accéder a aucune propriété mais lire uniquement les infos avec la méthode sayHello.
En compilant l’application, nous avons une erreur car name n’est plus accessible dans le main()
fun main() {
val zorro = User("De la vega", "Diego", 35)
zorro.name = "De la Puente"
zorro.sayHello()
}
//Méthodes
fun sayHello() {
println("Bonjour tout le monde, je suis $surname $name et j'ai $age ans.")
}
}
fi
Get et Set: propriétés calculées
En privatisant, vous limitez l’accès. Vous pouvez aller un peu plus loin encore en utilisant les propriétés calculées pour que l’on puisse obtenir
et modi er sous certaines conditions:
Par exemple nous souhaitons lire uniquement le nom complet et modi er l’age que si il augmente. Car on ne rajeunit pas malheureusement.
fun main() {
val zorro = User("De la vega", "Diego", 35)
println(zorro.agePublic)
zorro.agePublic = 33
println(zorro.agePublic)
}
On ne lui mettra donc pas de body mais juste le header avec ses propriétés. De
même class sera précédé de data.
Utiliser une data class pour Kotlin permet au programme de comprendre que ici
nous n’utiliserons que des données.
Par exemple une position d’utilisateur peut être une data class
data class userPosition(val city: String, val latitude: Double, val longitude:
Double)
Enum class
Enum est l’abréviation de énumération. Dans cette classe vous pourrez énumerer des
possibilités. Par ex:
Pour dé nir une valeur, on attribue le nom de l’enum class puis sa valeur
Nous pouvons aussi grâce à values() obtenir un array de tous les cas. Je l’ai converti ici en
liste pour pouvoir le convertir.