Ce guide rapide sur Kotlin récapitule les sujets abordés dans le cours sur les Principes de base d'Android en Kotlin sous la forme d'extraits de code.
En savoir plus
- Pour en savoir plus, consultez la documentation sur le langage Kotlin.
- Consultez la page Kotlin Koans pour vous entraîner sur des extraits supplémentaires. Remarque : Vous accéderez à un site externe, kotlinlang.org, développé par JetBrains.
Module 1
Programmes Kotlin
Le plus petit programme main() pour l'impression de texte
fun main() {
    println("Hello, world!")
}
Imprimer une ligne de texte
println("This is the text to print!")
Commentaires intégrés
// This is a comment line.
// This is another comment.
Variables
// Assign once, cannot change.
val age = "5"
val name = "Rover"
// Assign and change as needed.
var roll = 6
var rolledValue: Int = 4
Imprimer des variables avec des modèles de chaînes
println("You are already ${age}!")
println("You are already ${age} days old, ${name}!")
Types de données
Int       // Whole positive and negative numbers and zero
String    // Piece of text between quotes
IntRange  // Setting a range such as 1..6
Boolean   // Can only be true or false
Fonction sans arguments
// Define the function.
fun printHello () {
    println ("Hello Kotlin")
}
// Call the function.
printHello()
Fonction avec arguments
fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}
Fonction qui renvoie une valeur
fun roll(): Int {
     val randomNumber = (1..6).random()
     return randomNumber
}
Principaux opérateurs
*     // multiplication
/     // division
+     // addition
-     // subtraction
=     // assignment
Opérateurs logiques
>    // greater than
<    // less than
==   // equal
>=   // greater or equal
<=   // less or equal
!=   // not equal
Créer des nombres au hasard
val randomNumber = diceRange.random()
fun roll() {
     val anotherRandomNumber = (1..6).random()
     println(randomNumber)
}
Contrôler le flux du programme
Répéter une action avec repeat()
fun printBorder() {
    repeat(23) {
        print("=")
    }
}
Imbriquer des boucles repeat()
fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}
Instructions conditionnelles avec if/else
fun main() {
   val num = 4
   if (num > 4) {
       println("The variable is greater than 4")
   } else if (num == 4) {
       println("The variable is equal to 4")
   } else {
       println("The variable is less than 4")
   }
}
Instructions conditionnelles avec when
when (rollResult) {
    luckyNumber -> println("You won!")
    1 -> println("So sorry! You rolled a 1. Try again!")
    2 -> println("Sadly, you rolled a 2. Try again!")
    3 -> println("Unfortunately, you rolled a 3. Try again!")
    4 -> println("No luck! You rolled a 4. Try again!")
    5 -> println("Don't cry! You rolled a 5. Try again!")
    6 -> println("Apologies! you rolled a 6. Try again!")
}
Attribuer le résultat d'une instruction when à une variable
// Determine which drawable resource ID to use based on the dice roll.
val drawableResource = when (diceRoll) {
    1 -> R.drawable.dice_1
    2 -> R.drawable.dice_2
    3 -> R.drawable.dice_3
    4 -> R.drawable.dice_4
    5 -> R.drawable.dice_5
    else -> R.drawable.dice_6
}
Classes
Classe simple avec propriété et méthode
class Dice {
    var sides = 6
    fun roll() {
        val randomNumber = (1..6).random()
        println(randomNumber)
    }
}
Classe avec paramètre
class Dice (val numSides: Int) {
    fun roll(): Int {
        val randomNumber = (1..numSides).random()
        return randomNumber
    }
}
Créer des instances
val myFirstDice = Dice(6)
Module 2
Classes
Classe abstraite
abstract class Dwelling() {
}
Classe abstraite avec une propriété abstraite
abstract class Dwelling() {
    abstract val buildingMaterial: String
}
Classe abstraite avec une méthode abstraite
abstract class Dwelling() {
    abstract fun floorArea(): Double
}
Marquer une classe open pour qu'elle puisse être sous-classée
open class RoundHut(residents: Int) {
}
Créer une sous-classe en étendant une classe parente
class SquareCabin : Dwelling()
Remplacer une fonction d'une super-classe
override fun floorArea(): Double {
}
Appeler l'implémentation de la super-classe d'une fonction
override fun floorArea(): Double {
    return super.floorArea() * floors
}
Listes
Définir une liste en lecture seule
val numbers = listOf(1, 2, 3, 4, 5, 6)
Obtenir la taille de la liste
numbers.size
Obtenir le premier élément d'une liste
numbers[0]
Obtenir la copie d'une liste dans l'ordre inverse
listOf("red", "blue", "green").reversed()
Définir une liste de chaînes modifiable
val entrees = mutableListOf<String>()
Ajouter un élément à une liste modifiable
entrees.add("spaghetti")
Modifier un élément dans une liste modifiable
entrees[0] = "lasagna"
Supprimer un élément d'une liste modifiable
entrees.remove("lasagna")
Boucles
Utiliser la boucle for pour itérer les éléments d'une liste
for (element in myList) {
    // Perform an operation with each item
    println(element)
}
Utiliser la boucle while pour itérer les éléments d'une liste
var index = 0
while (index < myList.size) {
    println(myList[index])
    index++
}
Chaînes
Nombre de caractères dans une chaîne
val name = "Android"
println(name.length)
Utiliser une variable dans un modèle de chaîne
val number = 10
println("$number people")
Utiliser une expression dans un modèle de chaîne
val number = 10
val groups = 5
println("${number * groups} people")
Divers
Instructions augmentées
a += b   // a = a + b
a -= b   // a = a - b
a *= b   // a = a * b
a /= b   // a = a / b
Simplifier l'accès à un objet à l'aide de with
with(squareCabin) {
    println("Capacity: ${capacity}")
    println("Material: ${buildingMaterial}")
    println("Has room? ${hasRoom()}")
}
Importer depuis la bibliothèque mathématique Kotlin
import kotlin.math.PI
Utiliser un nom complet pour une constante de la bibliothèque mathématique Kotlin (aucune instruction d'importation n'est nécessaire)
kotlin.math.PI * radius * radius
Enchaîner des appels ensemble (pour accéder aux propriétés et aux méthodes d'appel)
val stringInTextField = binding.costOfService.text.toString()
Nombre variable d'arguments de fonction
fun addToppings(vararg val toppings: String)
Déclaration de package
package com.example.affirmations.model
Module 3
Sets
Créer un set à partir d'une liste
val numbers = listOf(0, 3, 8, 4, 0, 5, 5, 8, 9, 2)
val setOfNumbers = numbers.toSet()
Définir un set
val set1 = setOf(1,2,3)
val set2 = mutableSetOf(3, 4, 5)
Opérations d'ensemble
set1.intersect(set2) // 3
set1.union(set2) // 1, 2, 3, 4, 5
Maps
Définir une carte modifiable
val peopleAges = mutableMapOf<String, Int>(
    "Fred" to 30,
    "Ann" to 23
)
Définir une valeur dans une carte modifiable
peopleAges.put("Barbara", 42)
peopleAges["Joe"] = 51
Opérations de collection
Effectuer des itérations sur une collection
peopleAges.forEach { print("${it.key} is ${it.value}, ") }
// Fred is 31, Ann is 23, Barbara is 42, Joe is 51,
Transformer chaque élément d'une collection
println(peopleAges.map { "${it.key} is ${it.value}" }.joinToString(", ") )
// Fred is 31, Ann is 23, Barbara is 42, Joe is 51
Filtrer les éléments d'une collection
val filteredNames = peopleAges.filter { it.key.length < 4 }
println(filteredNames)
// {Ann=23, Joe=51}
Autres opérations de collecte
val words = listOf("about", "acute", "balloon", "best", "brief", "class")
val filteredWords = words.filter { it.startsWith("b", ignoreCase = true) }
    .shuffled() // [brief, balloon, best]
    .take(2) // [brief, balloon]
    .sorted() // [balloon, brief]
Fonctions de champ d'application
let
arguments?.let {
    letterId = it.getString(LETTER).toString()
}
apply
binding?.apply {
    ...
    flavorFragment = this@FlavorFragment
}
Divers
Propriété de support
private var _currentScrambledWord = "test"
val currentScrambledWord: String
    get() = _currentScrambledWord
Appels sécurisés
val letterId = intent?.extras?.getString("letter").toString()
Fonctions lambda
val triple: (Int) -> Int = { a: Int -> a * 3 }
println(triple(5))
Objets compagnons
class DetailActivity: AppCompatActivity() {
    ...
    companion object {
        const val LETTER = "letter"
    }
    ...
}
// accessible outside DetailActivity
DetailActivity.LETTER
Délégation de propriété
// syntax
var <property-name> : <property-type> by <delegate-class>()
// example
private val viewModel: GameViewModel by viewModels()
Initialisation tardive
private var wordsList: MutableList<String> = mutableListOf() // has a value at initialization
private lateinit var currentWord: String // needs to be assigned after initialization
Opérateur Elvis
var quantity : Int? = null
quantity ?: 0 // 0
quantity = 4
quantity ?: 0 // 4
Module 4
Coroutines
Déclarer une fonction de suspension
suspend fun getValue(): Double {
    // long running work or calls to other suspend functions
}
Exécuter une fonction de suspension dans GlobalScope
GlobalScope.launch {
    val output = getValue()
}
Appelez la fonction de suspension à partir d'une autre fonction de suspension.
suspend fun processValue() {
    val value = getValue()
    // modify the value
}
Accéder à une tâche de coroutine
val job: Job = GlobalScope.launch {
    val output = getValue()
}
Annuler une tâche de coroutine
job.cancel()
Exécuter une fonction de suspension et bloquer le thread actuel jusqu'à la fin de l'exécution de la fonction
runBlocking {
    val output = getValue()
}
Utiliser la fonction asynchrone pour pouvoir reporter une fonction de suspension
runBlocking {
    val output = await { getValue() }
    println("Output is ${output.await()}")
}
Divers
Déclarer un objet
object DataProviderManager {
}
Intercepter une exception
try {
    // code that may throw an error
} catch (exception: Exception) {
    // handle the thrown exception
}
Créer une classe d'énumération
enum class Direction {
    NORTH, SOUTH, WEST, EAST
}
Accéder à une valeur de classe énumération
val direction = Direction.NORTH
Vérifier les valeurs d'énumération
when (direction) {
    Directon.NORTH -> {
    }
    Direction.SOUTH -> {
    }
    Direction.WEST -> {
    }
    Direction.EAST -> {
    }
}
