INTRODUCTION
@r_schlick
@mikasez
Agenda
◦ Présentation générale
◦ Syntaxe générale
◦ Principales fonctionnalités
◦ Dans le contexte de VSP
◦ D’où vient Kotlin ?
◦ Objectifs
◦ Adoption dans l’écosystème
◦ Philosophie
◦ Concision
◦ Inférence de type
◦ Immuabilité
◦ Gestion des nulls
◦ Comptabilité avec librairies existantes
09/12/2020
Présentation générale
◦ Projet open-source démarré en 2010 par JetBrains
◦ Version 1.0 en Février 2016
◦ Epoque où Java stagne, en version 7 puis 8 sur le web
◦ Android toujours en version Java 6
◦ Les langages ont évolué, alors que Java traine derrière lui un lourd legacy.
◦ JetBrains n'était pas à leur coup d'essai, le travail sur MPS et les IDE ont permis de créer un langage intégré dans
l'écosystème Intellij Idea
09/12/2020
Présentation générale > D'où vient Kotlin ?
◦ Prendre le meilleur des langages, tout en se débarrassant des points les plus gênants
◦ Avoir un langage neuf, évoluant rapidement, intégré dans l'existant
◦ Le boilerplate technique est drastiquement réduit, permettant de réduire le code à écrire et le faire plus fonctionnel
09/12/2020
Présentation générale > Objectifs
◦ Le langage a rapidement conquis Android (support officiel Google 2017) puis le web
◦ Sa rétrocompatibilité et la possibilité de passer doucement du java à kotlin aide à l'adoption
◦ Il est beaucoup plus simple d'utilisation que certains langages comme Scala qui a été stoppé dans son adoption par sa
courbe d'apprentissage
◦ Il est beaucoup plus ferme sur ses opinions et plus strict sur son développement que groovy tout en permettant de
faire l'ensemble proposé par groovy aussi simplement, avec une documentation à jour.
◦ Compatible et utilisé dans les frameworks à la mode: Spring Boot, Micronaut, Quarkus, etc.
09/12/2020
Présentation générale > Adoption
◦ Concision : Un langage concis et fonctionnel
◦ Immuabilité : la plupart des problèmes viennent des objets qui changent, on les rend immuables par défaut
◦ Gestion des nulls : les nulls ont causé beaucoup de tord, on ne peut pas les interdire, pour être cohérent avec java, on les rend
difficiles à vivre
◦ Comptabilité avec librairies existantes: beaucoup d'excellents frameworks ont été écrits pour java. Autant pouvoir les utiliser.
09/12/2020
Présentation générale > Philosophie
◦ Fonctions
◦ Variables
◦ Annotations
◦ Null safety
◦ Gestion des exceptions
◦ Classes
◦ Object
09/12/2020
Syntaxe générale
Syntaxe générale > Packages
◦ Les packages sont faits de la même manière qu’en java.
◦ Quelques subtilités : plusieurs classes dans un même fichier
.kt
◦ Permet de regrouper des classes, enum, etc.
◦ A la compilation des classes séparées non anonymes (pas de
$1, $2 etc. comme en java).
09/12/2020
Syntaxe générale > Fonctions
◦ La déclaration des fonctions : fun
◦ Paramètres par défaut
◦ Possibilité de renseigner des paramètres par nom
◦ Return par défaut
◦ Plusieurs types de fonctions :
◦ open: peut être redéfinie
◦ inline: la fonction est incluse dans le code par le
compilateur
◦ Infix: Fonction comme des mots clés
◦ Le dernier paramètre, si c'est une fonction, peut être utilisé
pour chainer
09/12/2020
Syntaxe générale > Fonctions annexe
09/12/2020
Kotlin à la java
Kotlin
◦ Pas de int que des Int
◦ Pas de boolean que des Boolean...
◦ Possibilité d'ajouter des fonctions
directement aux nombres
◦ Plus besoin de conversion
09/12/2020
Syntaxe générale > Tout est Objet
Syntaxe générale > Variables
◦ var : variable modifiable
◦ val : variable immuable
◦ late init var : variable initialisée plus tard
◦ Simplification de la déclaration des variables.
◦ Déstructuration native : (_)
◦ Possibilité d'ignorer les paramètres non utiles.
◦ Surcharge des opérateurs.
09/12/2020
Syntaxe générale > Annotations
◦ Parfaitement égal aux annotations java.
◦ Tout ce qui est faisable en java est faisable en kotlin.
09/12/2020
Syntaxe générale > Null safety
◦ Objectif : Supprimer les NPE de la surface du
monde
◦ Null check à la compilation
◦ Variable nullable String? équivalent au
Optional<String> Java, mais en mieux
◦ Safe call avec ?
◦ Unsafe call avec !!
◦ Opérateur Elvis: ?: éq if/else
◦ nullable.?let{} éq if (nullable != null)
09/12/2020
Syntaxe générale > Gestion des exceptions
◦ Pas de checked exceptions.
◦ Remplacé par une annotation optionel @throws
◦ Syntaxe try / catch / finally similaire à java
◦ try peut être utilisé comme une expression et retourner
une valeur
◦ throw est une expression de type Nothing
09/12/2020
Syntaxe générale > Classes
◦ Une classe contient une entête avec éventuellement des
propriétés et un constructeur primary
◦ Un constructeur primaire déclaré en entête et des
constructeurs secondaires
◦ Valeurs par défaut sur les champs
◦ « init » méthodes pour initialiser l’instance
◦ Getters/Setters générés pour les champs publiques
◦ « Companion Object » pour les propriétés
et méthodes statiques
09/12/2020
Syntaxe générale > object
◦ object : type de données avec une unique instance
◦ object est une structure simple object/properties
◦ Penser comme un singleton lazy initialisé
◦ Pas besoin de déclaration comme une classe
09/12/2020
Principales fonctionnalités
◦ Control flow (if, loop, when expression, equality checks)
◦ Collections
◦ Data class
◦ Extension functions
◦ Scope functions
◦ String templates
◦ Smart cast
09/12/2020
Principales fonctionnalités > IF Expression
◦ Le if peut s'écrire à la manière de java, mais
également en tant qu'expression, plus besoin de
ternaire
◦ Le dernier élément du if est sa valeur de sortie
◦ S'il n'y a pas de else alors il doit être utilisé comme
en java
09/12/2020
Principales fonctionnalités > When expression
◦ Le when remplace le switch du java
◦ Il s'écrit comme des expressions classiques
◦ On peut utiliser n'importe quelle valeur du
switch tant que cela retourne une valeur
booléene
09/12/2020
Principales fonctionnalités > Loop
◦ Les boucles sont quasi identiques à leur équivalent
java
◦ Le for peut s’itérer sur tout ce qui a un itérateur, il
utilise le in pour spécifier la cible d’itération
◦ Le do while est utilisable, la variable d'iteration peut-
être initialisée à l’intérieur du do {}
09/12/2020
Principales fonctionnalités > Collections
◦ Elles reprennent la structure actuelle des collections
de java
◦ Une distinction nette est faite entre les collections
muables et immuables
09/12/2020
Principales fonctionnalités > Collection
◦ Les fonctionnalités relatives aux collections sont
incluses dans les collections.
◦ Il n’y a pas de CollectionUtils, Collections,
Collections2...
◦ L’ajout de méthodes devrait se faire de la même
manière (extension functions)
09/12/2020
Principales fonctionnalités > streams
◦ Accessibilité de tout java oblige :
◦ {} = kotlin
◦ () = java
◦ TIP : stream() : c’est du java
◦ Les traitements sur les collections sont eager par
défaut.
◦ Pour avoir un lazy mode, il faut utiliser asSequence
09/12/2020
Principales fonctionnalités > sequence
09/12/2020
Principales fonctionnalités > Extension Functions
◦ Capacité d’étendre une classe en ajoutant une
fonction sans avoir à hériter de la classe ou d’utiliser
un pattern comme Decorator
◦ Possible aussi d’étendre les propriétés d’une classe
09/12/2020
Principales fonctionnalités > Data class
◦ Ce sont des classes « pojo » pour stocker des valeurs
◦ Equivalent au Record de Java
◦ Méthodes auto-générées: equals() / hashCode(), toString(),
getters/setters, componentN(), copy()
◦ Standard Data Class : Pair, Triple
09/12/2020
Bytecode java généré ->
Principales fonctionnalités > Scope functions
◦ Execute un bloc de code dans le contexte d’un objet
◦ also, apply, let, run, with
◦ Distinctions : la manière de référencer l’objet et la valeur
de retour
09/12/2020
Principales fonctionnalités > String templates
◦ On peut utiliser des variables et expressions dans les Strings
◦ Raw String avec 3 double-quotes
09/12/2020
Principales fonctionnalités > Smart cast
◦ Le compilateur est assez malin pour auto-caster
◦ Opérateur is : safe cast
◦ Opérateur as : unsafe cast
◦ Combinaison is et when expression
09/12/2020

Introduction Kotlin

  • 1.
  • 2.
    Agenda ◦ Présentation générale ◦Syntaxe générale ◦ Principales fonctionnalités ◦ Dans le contexte de VSP
  • 3.
    ◦ D’où vientKotlin ? ◦ Objectifs ◦ Adoption dans l’écosystème ◦ Philosophie ◦ Concision ◦ Inférence de type ◦ Immuabilité ◦ Gestion des nulls ◦ Comptabilité avec librairies existantes 09/12/2020 Présentation générale
  • 4.
    ◦ Projet open-sourcedémarré en 2010 par JetBrains ◦ Version 1.0 en Février 2016 ◦ Epoque où Java stagne, en version 7 puis 8 sur le web ◦ Android toujours en version Java 6 ◦ Les langages ont évolué, alors que Java traine derrière lui un lourd legacy. ◦ JetBrains n'était pas à leur coup d'essai, le travail sur MPS et les IDE ont permis de créer un langage intégré dans l'écosystème Intellij Idea 09/12/2020 Présentation générale > D'où vient Kotlin ?
  • 5.
    ◦ Prendre lemeilleur des langages, tout en se débarrassant des points les plus gênants ◦ Avoir un langage neuf, évoluant rapidement, intégré dans l'existant ◦ Le boilerplate technique est drastiquement réduit, permettant de réduire le code à écrire et le faire plus fonctionnel 09/12/2020 Présentation générale > Objectifs
  • 6.
    ◦ Le langagea rapidement conquis Android (support officiel Google 2017) puis le web ◦ Sa rétrocompatibilité et la possibilité de passer doucement du java à kotlin aide à l'adoption ◦ Il est beaucoup plus simple d'utilisation que certains langages comme Scala qui a été stoppé dans son adoption par sa courbe d'apprentissage ◦ Il est beaucoup plus ferme sur ses opinions et plus strict sur son développement que groovy tout en permettant de faire l'ensemble proposé par groovy aussi simplement, avec une documentation à jour. ◦ Compatible et utilisé dans les frameworks à la mode: Spring Boot, Micronaut, Quarkus, etc. 09/12/2020 Présentation générale > Adoption
  • 7.
    ◦ Concision :Un langage concis et fonctionnel ◦ Immuabilité : la plupart des problèmes viennent des objets qui changent, on les rend immuables par défaut ◦ Gestion des nulls : les nulls ont causé beaucoup de tord, on ne peut pas les interdire, pour être cohérent avec java, on les rend difficiles à vivre ◦ Comptabilité avec librairies existantes: beaucoup d'excellents frameworks ont été écrits pour java. Autant pouvoir les utiliser. 09/12/2020 Présentation générale > Philosophie
  • 8.
    ◦ Fonctions ◦ Variables ◦Annotations ◦ Null safety ◦ Gestion des exceptions ◦ Classes ◦ Object 09/12/2020 Syntaxe générale
  • 9.
    Syntaxe générale >Packages ◦ Les packages sont faits de la même manière qu’en java. ◦ Quelques subtilités : plusieurs classes dans un même fichier .kt ◦ Permet de regrouper des classes, enum, etc. ◦ A la compilation des classes séparées non anonymes (pas de $1, $2 etc. comme en java). 09/12/2020
  • 10.
    Syntaxe générale >Fonctions ◦ La déclaration des fonctions : fun ◦ Paramètres par défaut ◦ Possibilité de renseigner des paramètres par nom ◦ Return par défaut ◦ Plusieurs types de fonctions : ◦ open: peut être redéfinie ◦ inline: la fonction est incluse dans le code par le compilateur ◦ Infix: Fonction comme des mots clés ◦ Le dernier paramètre, si c'est une fonction, peut être utilisé pour chainer 09/12/2020
  • 11.
    Syntaxe générale >Fonctions annexe 09/12/2020 Kotlin à la java Kotlin
  • 12.
    ◦ Pas deint que des Int ◦ Pas de boolean que des Boolean... ◦ Possibilité d'ajouter des fonctions directement aux nombres ◦ Plus besoin de conversion 09/12/2020 Syntaxe générale > Tout est Objet
  • 13.
    Syntaxe générale >Variables ◦ var : variable modifiable ◦ val : variable immuable ◦ late init var : variable initialisée plus tard ◦ Simplification de la déclaration des variables. ◦ Déstructuration native : (_) ◦ Possibilité d'ignorer les paramètres non utiles. ◦ Surcharge des opérateurs. 09/12/2020
  • 14.
    Syntaxe générale >Annotations ◦ Parfaitement égal aux annotations java. ◦ Tout ce qui est faisable en java est faisable en kotlin. 09/12/2020
  • 15.
    Syntaxe générale >Null safety ◦ Objectif : Supprimer les NPE de la surface du monde ◦ Null check à la compilation ◦ Variable nullable String? équivalent au Optional<String> Java, mais en mieux ◦ Safe call avec ? ◦ Unsafe call avec !! ◦ Opérateur Elvis: ?: éq if/else ◦ nullable.?let{} éq if (nullable != null) 09/12/2020
  • 16.
    Syntaxe générale >Gestion des exceptions ◦ Pas de checked exceptions. ◦ Remplacé par une annotation optionel @throws ◦ Syntaxe try / catch / finally similaire à java ◦ try peut être utilisé comme une expression et retourner une valeur ◦ throw est une expression de type Nothing 09/12/2020
  • 17.
    Syntaxe générale >Classes ◦ Une classe contient une entête avec éventuellement des propriétés et un constructeur primary ◦ Un constructeur primaire déclaré en entête et des constructeurs secondaires ◦ Valeurs par défaut sur les champs ◦ « init » méthodes pour initialiser l’instance ◦ Getters/Setters générés pour les champs publiques ◦ « Companion Object » pour les propriétés et méthodes statiques 09/12/2020
  • 18.
    Syntaxe générale >object ◦ object : type de données avec une unique instance ◦ object est une structure simple object/properties ◦ Penser comme un singleton lazy initialisé ◦ Pas besoin de déclaration comme une classe 09/12/2020
  • 19.
    Principales fonctionnalités ◦ Controlflow (if, loop, when expression, equality checks) ◦ Collections ◦ Data class ◦ Extension functions ◦ Scope functions ◦ String templates ◦ Smart cast 09/12/2020
  • 20.
    Principales fonctionnalités >IF Expression ◦ Le if peut s'écrire à la manière de java, mais également en tant qu'expression, plus besoin de ternaire ◦ Le dernier élément du if est sa valeur de sortie ◦ S'il n'y a pas de else alors il doit être utilisé comme en java 09/12/2020
  • 21.
    Principales fonctionnalités >When expression ◦ Le when remplace le switch du java ◦ Il s'écrit comme des expressions classiques ◦ On peut utiliser n'importe quelle valeur du switch tant que cela retourne une valeur booléene 09/12/2020
  • 22.
    Principales fonctionnalités >Loop ◦ Les boucles sont quasi identiques à leur équivalent java ◦ Le for peut s’itérer sur tout ce qui a un itérateur, il utilise le in pour spécifier la cible d’itération ◦ Le do while est utilisable, la variable d'iteration peut- être initialisée à l’intérieur du do {} 09/12/2020
  • 23.
    Principales fonctionnalités >Collections ◦ Elles reprennent la structure actuelle des collections de java ◦ Une distinction nette est faite entre les collections muables et immuables 09/12/2020
  • 24.
    Principales fonctionnalités >Collection ◦ Les fonctionnalités relatives aux collections sont incluses dans les collections. ◦ Il n’y a pas de CollectionUtils, Collections, Collections2... ◦ L’ajout de méthodes devrait se faire de la même manière (extension functions) 09/12/2020
  • 25.
    Principales fonctionnalités >streams ◦ Accessibilité de tout java oblige : ◦ {} = kotlin ◦ () = java ◦ TIP : stream() : c’est du java ◦ Les traitements sur les collections sont eager par défaut. ◦ Pour avoir un lazy mode, il faut utiliser asSequence 09/12/2020
  • 26.
    Principales fonctionnalités >sequence 09/12/2020
  • 27.
    Principales fonctionnalités >Extension Functions ◦ Capacité d’étendre une classe en ajoutant une fonction sans avoir à hériter de la classe ou d’utiliser un pattern comme Decorator ◦ Possible aussi d’étendre les propriétés d’une classe 09/12/2020
  • 28.
    Principales fonctionnalités >Data class ◦ Ce sont des classes « pojo » pour stocker des valeurs ◦ Equivalent au Record de Java ◦ Méthodes auto-générées: equals() / hashCode(), toString(), getters/setters, componentN(), copy() ◦ Standard Data Class : Pair, Triple 09/12/2020 Bytecode java généré ->
  • 29.
    Principales fonctionnalités >Scope functions ◦ Execute un bloc de code dans le contexte d’un objet ◦ also, apply, let, run, with ◦ Distinctions : la manière de référencer l’objet et la valeur de retour 09/12/2020
  • 30.
    Principales fonctionnalités >String templates ◦ On peut utiliser des variables et expressions dans les Strings ◦ Raw String avec 3 double-quotes 09/12/2020
  • 31.
    Principales fonctionnalités >Smart cast ◦ Le compilateur est assez malin pour auto-caster ◦ Opérateur is : safe cast ◦ Opérateur as : unsafe cast ◦ Combinaison is et when expression 09/12/2020

Notes de l'éditeur

  • #3 Présentation générale (10 min) Syntaxe générale (20 min) Principales fonctionnalités (25min) Dans le contexte de LOKI (5 min)
  • #4 Kotlin vient de l'idée de faire un langage prenant en compte l'évolution de la théorie des langages et intégrant les points qui ont prouvé leur valeur au fils des années. Répondant à une évolution beaucoup trop lente du java, il en corrige les problèmes principaux tout en restant compatible quasi-totalement avec l'ensemble de ses librairies. Le langage est développé par JetBrains, le studio derrière Intellij. Forts de leur expérience avec les éditeurs les plus populaires du marché (intellij, webstorm, phpstorm, clion...) ils ont repris le meilleur de ces langages tout en gardant une identité forte.  Le but était : créer un langage concis, enlévant le plus de boilerplate technique possible. Le but est d'avoir un langage avec lequel on écrit le metier et non plein de petits trucs techniques inutiles (equals, hashcode, getter, setter : rarement pérsonnalisés et le langage offre la possibilité de le faire uniquement en cas de bésoin.) Le langage offre également un typage fort et quasi invisible. On se repose entièrement sur son éditeur (intellij ou eclipse) pour déterminer le type visuellement en cas de besoin. On a plus besoin d'écire : Map<String, Map<Integer, String> map... un simple val map = mapOf suffit.  Le langage prône l'immuabilité. Il est bien plus simple de créer des objets, collections immuables. Bien sûr il est toujours possible d'utiliser les collections permettant la modification, par souci de compatibilité avec le java, mais c'est peu recommandé pour le bien du développeur (éviter le sneaky change) Null, appelé billion dollar mistake par son concepteur est une notion fortement découragé dans le langage et il est impossible d'utiliser des variables nullables sans faire un traitement spécifique et concis dans le cas d'un null. Bien que cet aspec ne fait pas l'unanimité (Uncle bob) c'est un ajout important à mes yeux au langage. 
  • #5 Kotlin vient de l'idée de faire un langage prenant en compte l'évolution de la théorie des langages et intégrant les points qui ont prouvé leur valeur au fils des années. Répondant à une évolution beaucoup trop lente du java, il en corrige les problèmes principaux tout en restant compatible quasi-totalement avec l'ensemble de ses librairies. Le langage est développé par JetBrains, le studio derrière Intellij. Forts de leur expérience avec les éditeurs les plus populaires du marché (intellij, webstorm, phpstorm, clion...) ils ont repris le meilleur de ces langages tout en gardant une identité forte. 
  • #6  Le but était : créer un langage concis, enlévant le plus de boilerplate technique possible. Le but est d'avoir un langage avec lequel on écrit le metier et non plein de petits trucs techniques inutiles (equals, hashcode, getter, setter : rarement pérsonnalisés et le langage offre la possibilité de le faire uniquement en cas de bésoin.) Le langage offre également un typage fort et quasi invisible. On se repose entièrement sur son éditeur (intellij ou eclipse) pour déterminer le type visuellement en cas de besoin. On a plus besoin d'écire : Map<String, Map<Integer, String> map... un simple val map = mapOf suffit.  Le langage prône l'immuabilité. Il est bien plus simple de créer des objets, collections immuables. Bien sûr il est toujours possible d'utiliser les collections permettant la modification, par souci de compatibilité avec le java, mais c'est peu recommandé pour le bien du développeur (éviter le sneaky change) Null, appelé billion dollar mistake par son concepteur est une notion fortement découragé dans le langage et il est impossible d'utiliser des variables nullables sans faire un traitement spécifique et concis dans le cas d'un null. Bien que cet aspec ne fait pas l'unanimité (Uncle bob) c'est un ajout important à mes yeux au langage. 
  • #7 Attention cela rend pas Scala mauvais ou mort : il est toujours très utilisé. Il est bien pratique pour des applications rapides. Mais sa courbe d'apprentissage est désastreuse. Soit tu sais coder en fonctionnel scala, soit tu code du java, même si cela a un .scl à la fin. De même pour groovy, mais à nuancer, on parle de la mort de groovy l'année suivante de son apparition, avec des problèmes toujours pas résolus à ce jour, et puis il est dans le "cimetière des projets"…
  • #8 Kotlin vient de l'idée de faire un langage prenant en compte l'évolution de la théorie des langages et intégrant les points qui ont prouvé leur valeur au fils des années. Répondant à une évolution beaucoup trop lente du java, il en corrige les problèmes principaux tout en restant compatible quasi-totalement avec l'ensemble de ses librairies. Le langage est développé par JetBrains, le studio derrière Intellij. Forts de leur expérience avec les éditeurs les plus populaires du marché (intellij, webstorm, phpstorm, clion...) ils ont repris le meilleur de ces langages tout en gardant une identité forte.  Le but était : créer un langage concis, enlévant le plus de boilerplate technique possible. Le but est d'avoir un langage avec lequel on écrit le metier et non plein de petits trucs techniques inutiles (equals, hashcode, getter, setter : rarement pérsonnalisés et le langage offre la possibilité de le faire uniquement en cas de bésoin.) Le langage offre également un typage fort et quasi invisible. On se repose entièrement sur son éditeur (intellij ou eclipse) pour déterminer le type visuellement en cas de besoin. On a plus besoin d'écire : Map<String, Map<Integer, String> map... un simple val map = mapOf suffit.  Le langage prône l'immuabilité. Il est bien plus simple de créer des objets, collections immuables. Bien sûr il est toujours possible d'utiliser les collections permettant la modification, par souci de compatibilité avec le java, mais c'est peu recommandé pour le bien du développeur (éviter le sneaky change) Null, appelé billion dollar mistake par son concepteur est une notion fortement découragé dans le langage et il est impossible d'utiliser des variables nullables sans faire un traitement spécifique et concis dans le cas d'un null. Bien que cet aspec ne fait pas l'unanimité (Uncle bob) c'est un ajout important à mes yeux au langage. 
  • #9 Fonctions : TODO Tout est objet, pas de type primitif. https://play.kotlinlang.org/byExample/01_introduction/02_Functions Variables :  Val immuable, var modifiable, destrucuration val (a,b) = machin() ignorer un paramètre : _, ex val (_, b) = machin() . Le _ peut bien sûr être utilisé partout où un paramètre est ignoré. Pareil qu'en scala.  L'ensemble des opérateurs peuvent être surchargés. Cela peut être dangereux du coup utiliser avec parcimonie après en avoir discuté avec l'équipe.  Certains le sont déjà val list += objet : ajout un objet à la liste. Simple, pratique, compréhensible pour tout le monde.  Annotations  Les annotations sont faites de la même manière qu'en java. 100% compatibles @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) annotation class TestSize(val size: TestSizes) https://kotlinlang.org/docs/tutorials/kotlin-for-py/annotations.html
  • #13 https://kotlinlang.org/docs/reference/null-safety.html https://play.kotlinlang.org/byExample/01_introduction/04_Null%20Safety
  • #14 Val immuable, var modifiable, destrucuration val (a,b) = machin() ignorer un paramètre : _, ex val (_, b) = machin() . Le _ peut bien sûr être utilisé partout où un paramètre est ignoré. Pareil qu'en scala.  L'ensemble des opérateurs peuvent être surchargés. Cela peut être dangereux du coup utiliser avec parcimonie après en avoir discuté avec l'équipe.  Certains le sont déjà val list += objet : ajout un objet à la liste. Simple, pratique, compréhensible pour tout le monde.  https://kotlinlang.org/docs/reference/operator-overloading.html#operator-overloading
  • #15 https://kotlinlang.org/docs/reference/null-safety.html https://play.kotlinlang.org/byExample/01_introduction/04_Null%20Safety
  • #16 https://kotlinlang.org/docs/reference/null-safety.html https://play.kotlinlang.org/byExample/01_introduction/04_Null%20Safety ?: si non null ?.let{} traitement si n’est pas null Garde en mémoire le check du null, !! Est à appeler qu’une seule fois
  • #17 https://kotlinlang.org/docs/reference/exceptions.html
  • #19 https://kotlinlang.org/docs/reference/object-declarations.html
  • #21 https://kotlinlang.org/docs/reference/extensions.html https://play.kotlinlang.org/byExample/04_functional/03_extensionFunctions
  • #22 https://kotlinlang.org/docs/reference/extensions.html https://play.kotlinlang.org/byExample/04_functional/03_extensionFunctions
  • #23 https://kotlinlang.org/docs/reference/extensions.html https://play.kotlinlang.org/byExample/04_functional/03_extensionFunctions
  • #24 https://kotlinlang.org/docs/reference/extensions.html https://play.kotlinlang.org/byExample/04_functional/03_extensionFunctions
  • #27 https://typealias.com/guides/kotlin-sequences-illustrated-guide/
  • #28 https://kotlinlang.org/docs/reference/extensions.html https://play.kotlinlang.org/byExample/04_functional/03_extensionFunctions
  • #30 https://play.kotlinlang.org/byExample/06_scope_functions/01_let https://kotlinlang.org/docs/reference/scope-functions.html https://www.baeldung.com/kotlin-scope-functions
  • #31 https://play.kotlinlang.org/byExample/08_productivity_boosters/02_String%20Templates
  • #32 https://kotlinlang.org/docs/reference/typecasts.html https://play.kotlinlang.org/byExample/08_productivity_boosters/04_Smart%20Casts