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
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
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
}
}
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 👍
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)
}
}
}
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)
}