SlideShare une entreprise Scribd logo
1  sur  52
Télécharger pour lire hors ligne
UX DESIGN TECHNICAL EXPERTISE ADVANCED TRAINING
MEETUP - KOTLIN
DESCRIPTION
KOTLIN & ANDROID
Let’s have some fun
‣ Introduction Kotlin
‣ Type inférence
‣ Propriétés
‣ Null Safety
‣ Lambdas
‣ Ordre des paramètres dans une fonction
‣ triple ===, comparaison valeur a valeur
‣ for, while, do, switch syntaxe
Sommaire
‣ Smart cast
‣ Extension de fonction
‣ Infix function
‣ Data class
‣ Sealed class
Sommaire
KOTLIN. Pourquoi ?
KOTLIN de médicis
KOTLIN Deneuve
KOTLIN Zeta-Jones
Kotlin Island, St Petersburg
📍
‣ Créé en 2010 par JetBrains
‣ Open source en 2012 

https://github.com/JetBrains/kotlin
‣ v1.0 sortie en février 2016, v1.1 mars 2017
‣ Language fortement typé
‣ 100% compatible avec Java (JVM)
‣ Safe : notions “Null safety” 😎
‣ Concis (plus de ;)
‣ Type inference
Introduction Kotlin
‣ Génère bytecode compatible avec Java 6 => Ok
avec Android
‣ Utilisable dans Eclipse (Plugin), Maven & Ant
‣ Roadmap :
‣ v1.0 : bug fixes, IDE support, ne pas affecter le
langage, lint checks
‣ v1.1 : new language features (async/await/yield),
type alias, …
Kotlin
‣ Copie de code Java avec conversion : 👍
Kotlin
‣ Source : https://kotlinlang.org/
Kotlin
‣ Installation du plug-in (dernière version : 1.1.2)
Intégration Android Studio 2.3
‣ Création d’une nouvelle activité
Comment l’intégrer ?
‣ Ajouter le support de Kotlin au projet
1. Modification du fichier gradle du projet
2. Modification du fichier gradle du module
Comment l’intégrer ?
‣ Type sur une variable non nécessaire
‣ Déterminé par la première valeur
Type inférence
val day: Int = 14 // Type Int précisé
val month = 6 // Type Int déterminé
‣ Deux possibilités :
‣ Mutable : var
‣ Immutable : val
Propriétés
class Article {
val defaultId = -1
var title: String = ""
var content: String = ""
}
‣ Utilisation des propriétés :
Propriétés
var article = Article()
article.title = "Support officiel de Kotlin par Google”
article.content = "Google supporte désormais officiellement
le langage Kotlin pour le développement Android."
‣ Getter et setter par défaut
‣ Surchage possible via
‣ get() & set()
Propriétés
// Read-only: get
val isFilled: Boolean
get() = !title.isEmpty()
// Read-write: get and set
var fullContent: String
get() = title+"#"+content
set(value) {
var split = fullContent.split("#")
if(split.size>=2) {
this.title = split.get(0)
this.subTitle = split.get(1)
}
}
‣ Possibilité de définir un constructeur primaire
‣ Directement lié à la classe
Constructeur
class Article(val title:String, val subtitle: String) {
}
‣ Constructeurs secondaires
‣ Obligation d’appeler le constructeur primaire
directement ou indirectement
Constructeur
class Article(val title:String) {
lateinit var subTitle: String
constructor(title: String, subTitle: String) : this(title) {
this.subTitle = subTitle
}
}
Null safety
java.lang.NullPointerException
‣ Caractère ? pour préciser qu’une variable est
potentiellement nulle
Null safety
var title: String = "Default Title"
title = null // Impossible!
var subTitle: String? = "Default subtitle"
subTitle = null // Ok
‣ Pour effectuer un appel de manière sécurisé :
opérateur ?
‣ Retours possibles :
‣ valeur
‣ null
Safe call
val length = subTitle.length // Potentiel Null Pointer Exception !
val length = subTitle?.length // Ok, length: Int?
Elvis Operator
Aime-moi tendre, aime-moi vrai.
Elvis Operator
?:
Elvis Operator
?:
‣ Résultat :
‣ valeur (si non nul)
‣ 0 (si nul)
Elvis Operator
val length = subTitle?.length ?: 0
Operator !!
override fun onCreateView(inflater: LayoutInflater?,
container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
return inflater!!.inflate(R.layout.fragment_list, container,
false)
}
‣ Opérateur as?
‣ Si le cast échoue retourne null
Safe casts
val currentLength = length as? Int
‣ Possibilité de modifier l’ordre des paramètres :
Ordre des opérateurs dans une fonction
fun displayMessage(message: String, repeatCount: Int = 1) {
}
// Java Style
displayMessage("Hello", 10)
// With default parameter repeatCount = 1
displayMessage("Is it me you're looking for? ")
// inverted order with parameter name
displayMessage(repeatCount = 2, message = "I can see it in your
eyes. I can see it in your smile.”)
‣ Expressions lambda = fonctions anonymes
‣ entourée d’accolades { }
‣ paramètres optionnels
‣ un type de retour
‣ un corps
Lambdas
‣ Forme complète :





‣ Forme réduite :
‣ Utilisation :
Lambdas
val sum: (Int, Int) -> Int = { x, y -> x + y }
val sum = { x: Int, y: Int -> x + y }
val resultSum = sum(10, 30)
‣ Mot-clef it : nom du paramètre unique par défaut
Syntaxe
val values = mutableListOf<Int>(10, 12, 14)
val valuesOver10 = values.filter { it>10 }
‣ Appelé égalité référentielle
‣ === retourne vrai si les deux références pointent
sur le même objet
‣ inverse !==
Opérateur ===
‣ Appelé égalité structurelle
Opérateur ==
value1==value2
// équivalent à
value1?.equals(value2) ?: (value2 === null)
Null Safety 👍
‣ Initialisation retardée
Lazy
val allArticles: List<Article> by lazy {
parseJSON()
}
‣ For loop
Boucle
val titles = listOf<String>("Kotlin is awesome", "🤓",
"Let's have some fun")
for(title in titles) {
print("title $title")
}
‣ For loop
Boucle
for ((index, value) in titles.withIndex()) {
println("element ad $index = $value")
}
‣ while / do while
while(index>0) {
index--
println("index : $index")
}
do{
values.add(currentValues[index])
index++
}while(index<maxIndex)
Switch
Nop ❗
When
var selectedIndex =
when(selectedIndex) {
HOME_INDEX -> {
}
SEARCH_INDEX -> {
}
SETTINGS_INDEX -> displaySettings()
else -> {
}
}
‣ Permet de trans-typer à la volée (localement)
Smart cast
fun arrangeValue(value: Number) {
if(value is Int) {
integerValues.add(value)
}
if(value is Float) {
floatValues.add(value)
}
}
‣ Possibilité d’utilisation avec when
Smart cast
fun arrangeValue(value: Number) {
when(value) {
is Int -> integerValues.add(value)
is Long -> longValues.add(value)
is Float -> floatValues.add(value)
is Double -> doubleValues.add(value)
else -> {
otherValues.add(value)
}
}
}
Smart cast
if(key !is String || key.isBlank()) return
if(allKeys.contains(key)) {
}
Extension de fonction
fun AppCompatActivity.findFragment(@IdRes id: Int):
Fragment? {
return supportFragmentManager.findFragmentById(id)
}
class MainActivity : AppCompatActivity() {
…
val fragment = findFragment(R.id.main_fragment)
}
‣ Extension de de fonction avec un seul paramètre
Infix function
infix fun Int.power(power: Int): Int {
if(power==0) return 1
var result = this
for(i in 1..power-1) {
result *= this
}
return result
}
10 power 3
10.power(3)
‣ Utile pour créer des POJO
‣ Compilateur ajoute automatiquement les
méthodes suivantes (basées sur les ivar) :
‣ equals() / hashCode()
‣ toString()
‣ componentN() méthodes
‣ copy()
Data Class
data class Author(val firstname: String, val lastname: String)
‣ Equivalent d’un Enum avec un ensemble de
valeurs (variables)
Sealed Class
sealed class PublishResult {
class Success(val article: Article) : PublishResult()
class Failure(val error: Error) : PublishResult()
}
val result = publish("Let's get it started with Kotlin!", "My
first week with Kotlin")
when(result) {
is PublishResult.Success -> display(result.article)
is PublishResult.Failure -> showErrorMessage(result.error)
}
Merci

Contenu connexe

Tendances

Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojurelolopetit
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCDamien Seguy
 
CocoaHeads Toulouse - Getting to the core of Core Data
CocoaHeads Toulouse - Getting to the core of Core DataCocoaHeads Toulouse - Getting to the core of Core Data
CocoaHeads Toulouse - Getting to the core of Core DataCocoaHeads France
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
Sirikit par Julien Coudsi
Sirikit par Julien CoudsiSirikit par Julien Coudsi
Sirikit par Julien CoudsiIdean France
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentationjulien pauli
 
Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes Geeks Anonymes
 
Procédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsProcédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsDenis Voituron
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
PHP #1 : introduction
PHP #1 : introductionPHP #1 : introduction
PHP #1 : introductionJean Michel
 

Tendances (16)

mix-it 2011
mix-it 2011mix-it 2011
mix-it 2011
 
Mix it 2011 - Clojure
Mix it 2011 - ClojureMix it 2011 - Clojure
Mix it 2011 - Clojure
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
 
Promises Javascript
Promises JavascriptPromises Javascript
Promises Javascript
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
CocoaHeads Toulouse - Getting to the core of Core Data
CocoaHeads Toulouse - Getting to the core of Core DataCocoaHeads Toulouse - Getting to the core of Core Data
CocoaHeads Toulouse - Getting to the core of Core Data
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Sirikit par Julien Coudsi
Sirikit par Julien CoudsiSirikit par Julien Coudsi
Sirikit par Julien Coudsi
 
ZendFramework2 - Présentation
ZendFramework2 - PrésentationZendFramework2 - Présentation
ZendFramework2 - Présentation
 
Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes Cappuccino - ou comment créer une application web en 5 minutes
Cappuccino - ou comment créer une application web en 5 minutes
 
Procédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsProcédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénients
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
PHP #1 : introduction
PHP #1 : introductionPHP #1 : introduction
PHP #1 : introduction
 

Similaire à Meetup#1 talk#1

Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)Julien CROUZET
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosPublicis Sapient Engineering
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introOlivier Mallassi
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScriptKristen Le Liboux
 
JavaScript prise en main et fondamentaux
JavaScript prise en main et fondamentauxJavaScript prise en main et fondamentaux
JavaScript prise en main et fondamentauxVincent Petetin
 
Javascript Json artchitecture
Javascript  Json artchitecture Javascript  Json artchitecture
Javascript Json artchitecture zaghir
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLHervé Leclerc
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHPjulien pauli
 

Similaire à Meetup#1 talk#1 (20)

Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Javascript les générateurs (generators)
Javascript   les générateurs (generators)Javascript   les générateurs (generators)
Javascript les générateurs (generators)
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
JavaScript prise en main et fondamentaux
JavaScript prise en main et fondamentauxJavaScript prise en main et fondamentaux
JavaScript prise en main et fondamentaux
 
Javascript Json artchitecture
Javascript  Json artchitecture Javascript  Json artchitecture
Javascript Json artchitecture
 
C libro escenarioii
C libro escenarioiiC libro escenarioii
C libro escenarioii
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQL
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 

Meetup#1 talk#1

  • 1. UX DESIGN TECHNICAL EXPERTISE ADVANCED TRAINING MEETUP - KOTLIN
  • 4. ‣ Introduction Kotlin ‣ Type inférence ‣ Propriétés ‣ Null Safety ‣ Lambdas ‣ Ordre des paramètres dans une fonction ‣ triple ===, comparaison valeur a valeur ‣ for, while, do, switch syntaxe Sommaire
  • 5. ‣ Smart cast ‣ Extension de fonction ‣ Infix function ‣ Data class ‣ Sealed class Sommaire
  • 10. Kotlin Island, St Petersburg 📍
  • 11. ‣ Créé en 2010 par JetBrains ‣ Open source en 2012 
 https://github.com/JetBrains/kotlin ‣ v1.0 sortie en février 2016, v1.1 mars 2017 ‣ Language fortement typé ‣ 100% compatible avec Java (JVM) ‣ Safe : notions “Null safety” 😎 ‣ Concis (plus de ;) ‣ Type inference Introduction Kotlin
  • 12. ‣ Génère bytecode compatible avec Java 6 => Ok avec Android ‣ Utilisable dans Eclipse (Plugin), Maven & Ant ‣ Roadmap : ‣ v1.0 : bug fixes, IDE support, ne pas affecter le langage, lint checks ‣ v1.1 : new language features (async/await/yield), type alias, … Kotlin
  • 13. ‣ Copie de code Java avec conversion : 👍 Kotlin
  • 14. ‣ Source : https://kotlinlang.org/ Kotlin
  • 15. ‣ Installation du plug-in (dernière version : 1.1.2) Intégration Android Studio 2.3
  • 16. ‣ Création d’une nouvelle activité Comment l’intégrer ?
  • 17. ‣ Ajouter le support de Kotlin au projet 1. Modification du fichier gradle du projet 2. Modification du fichier gradle du module Comment l’intégrer ?
  • 18. ‣ Type sur une variable non nécessaire ‣ Déterminé par la première valeur Type inférence val day: Int = 14 // Type Int précisé val month = 6 // Type Int déterminé
  • 19. ‣ Deux possibilités : ‣ Mutable : var ‣ Immutable : val Propriétés class Article { val defaultId = -1 var title: String = "" var content: String = "" }
  • 20. ‣ Utilisation des propriétés : Propriétés var article = Article() article.title = "Support officiel de Kotlin par Google” article.content = "Google supporte désormais officiellement le langage Kotlin pour le développement Android."
  • 21. ‣ Getter et setter par défaut ‣ Surchage possible via ‣ get() & set() Propriétés // Read-only: get val isFilled: Boolean get() = !title.isEmpty() // Read-write: get and set var fullContent: String get() = title+"#"+content set(value) { var split = fullContent.split("#") if(split.size>=2) { this.title = split.get(0) this.subTitle = split.get(1) } }
  • 22. ‣ Possibilité de définir un constructeur primaire ‣ Directement lié à la classe Constructeur class Article(val title:String, val subtitle: String) { }
  • 23. ‣ Constructeurs secondaires ‣ Obligation d’appeler le constructeur primaire directement ou indirectement Constructeur class Article(val title:String) { lateinit var subTitle: String constructor(title: String, subTitle: String) : this(title) { this.subTitle = subTitle } }
  • 25. ‣ Caractère ? pour préciser qu’une variable est potentiellement nulle Null safety var title: String = "Default Title" title = null // Impossible! var subTitle: String? = "Default subtitle" subTitle = null // Ok
  • 26. ‣ Pour effectuer un appel de manière sécurisé : opérateur ? ‣ Retours possibles : ‣ valeur ‣ null Safe call val length = subTitle.length // Potentiel Null Pointer Exception ! val length = subTitle?.length // Ok, length: Int?
  • 30. ‣ Résultat : ‣ valeur (si non nul) ‣ 0 (si nul) Elvis Operator val length = subTitle?.length ?: 0
  • 31. Operator !! override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { // Inflate the layout for this fragment return inflater!!.inflate(R.layout.fragment_list, container, false) }
  • 32. ‣ Opérateur as? ‣ Si le cast échoue retourne null Safe casts val currentLength = length as? Int
  • 33. ‣ Possibilité de modifier l’ordre des paramètres : Ordre des opérateurs dans une fonction fun displayMessage(message: String, repeatCount: Int = 1) { } // Java Style displayMessage("Hello", 10) // With default parameter repeatCount = 1 displayMessage("Is it me you're looking for? ") // inverted order with parameter name displayMessage(repeatCount = 2, message = "I can see it in your eyes. I can see it in your smile.”)
  • 34. ‣ Expressions lambda = fonctions anonymes ‣ entourée d’accolades { } ‣ paramètres optionnels ‣ un type de retour ‣ un corps Lambdas
  • 35. ‣ Forme complète :
 
 
 ‣ Forme réduite : ‣ Utilisation : Lambdas val sum: (Int, Int) -> Int = { x, y -> x + y } val sum = { x: Int, y: Int -> x + y } val resultSum = sum(10, 30)
  • 36. ‣ Mot-clef it : nom du paramètre unique par défaut Syntaxe val values = mutableListOf<Int>(10, 12, 14) val valuesOver10 = values.filter { it>10 }
  • 37. ‣ Appelé égalité référentielle ‣ === retourne vrai si les deux références pointent sur le même objet ‣ inverse !== Opérateur ===
  • 38. ‣ Appelé égalité structurelle Opérateur == value1==value2 // équivalent à value1?.equals(value2) ?: (value2 === null) Null Safety 👍
  • 39. ‣ Initialisation retardée Lazy val allArticles: List<Article> by lazy { parseJSON() }
  • 40. ‣ For loop Boucle val titles = listOf<String>("Kotlin is awesome", "🤓", "Let's have some fun") for(title in titles) { print("title $title") }
  • 41. ‣ For loop Boucle for ((index, value) in titles.withIndex()) { println("element ad $index = $value") }
  • 42. ‣ while / do while while(index>0) { index-- println("index : $index") } do{ values.add(currentValues[index]) index++ }while(index<maxIndex)
  • 44. When var selectedIndex = when(selectedIndex) { HOME_INDEX -> { } SEARCH_INDEX -> { } SETTINGS_INDEX -> displaySettings() else -> { } }
  • 45. ‣ Permet de trans-typer à la volée (localement) Smart cast fun arrangeValue(value: Number) { if(value is Int) { integerValues.add(value) } if(value is Float) { floatValues.add(value) } }
  • 46. ‣ Possibilité d’utilisation avec when Smart cast fun arrangeValue(value: Number) { when(value) { is Int -> integerValues.add(value) is Long -> longValues.add(value) is Float -> floatValues.add(value) is Double -> doubleValues.add(value) else -> { otherValues.add(value) } } }
  • 47. Smart cast if(key !is String || key.isBlank()) return if(allKeys.contains(key)) { }
  • 48. Extension de fonction fun AppCompatActivity.findFragment(@IdRes id: Int): Fragment? { return supportFragmentManager.findFragmentById(id) } class MainActivity : AppCompatActivity() { … val fragment = findFragment(R.id.main_fragment) }
  • 49. ‣ Extension de de fonction avec un seul paramètre Infix function infix fun Int.power(power: Int): Int { if(power==0) return 1 var result = this for(i in 1..power-1) { result *= this } return result } 10 power 3 10.power(3)
  • 50. ‣ Utile pour créer des POJO ‣ Compilateur ajoute automatiquement les méthodes suivantes (basées sur les ivar) : ‣ equals() / hashCode() ‣ toString() ‣ componentN() méthodes ‣ copy() Data Class data class Author(val firstname: String, val lastname: String)
  • 51. ‣ Equivalent d’un Enum avec un ensemble de valeurs (variables) Sealed Class sealed class PublishResult { class Success(val article: Article) : PublishResult() class Failure(val error: Error) : PublishResult() } val result = publish("Let's get it started with Kotlin!", "My first week with Kotlin") when(result) { is PublishResult.Success -> display(result.article) is PublishResult.Failure -> showErrorMessage(result.error) }
  • 52. Merci