Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin Hands-on

Kotlin Hands-on

MorningTech on Kotlin

Laurent BARESSE

March 18, 2017
Tweet

More Decks by Laurent BARESSE

Other Decks in Technology

Transcript

  1. Schedule 9:00 - Introduction 9:05 - Intro to Kotlin part

    1 9:25 - Project presentation & setup 9:35 - Hands-on part 1 (55 minutes) 10:30 - Coffee break 10:45 - Intro to Kotlin part 2 11:00 - Hands-on part 2 (55 minutes) 11:55 - Final Part #androiddev #kotlin #morningtech @ekito
  2. @Baresse Work @ ekito Developer & Geek Fullstack & Mobile

    Laurent BARESSE @arnogiu Work @ ekito Core & Gear Maker Mobile & Cloud Arnaud GIULIANI #androiddev #kotlin #morningtech @ekito
  3. What’s Kotlin ? - Fully open source (built by Jetbrains)

    - Run on Java 6+ - Static typing & type inference - Modern language features - 1st grade tooling #androiddev #kotlin #morningtech @ekito
  4. What’s inside Kotlin ? - String templates - Properties -

    Lambdas - Data class - Smart cast - Null safety - Lazy property - Default values for function parameters - Extension Functions - No more ; - Single-expression functions - When expression - let, apply, use, with - Collections - Android Extensions Plugin #androiddev #kotlin #morningtech @ekito
  5. Compare with Same conciseness and expressive code, but Kotlin static

    typing and null-safety make a big difference. "Some people say Kotlin has 80% the power of Scala, with 20% of the features" * 
 "Kotlin is a software engineering language in contrast to Scala which is a computing science language." * Swift and Kotlin are VERY similar. Swift is LLVM based and has C interop while Kotlin is JVM based and has Java interop. * Quotes from Kotlin: The Ying and Yang of Programming Languages #androiddev #kotlin #morningtech @ekito @ sdeleuze
  6. Typing & Inference val a: Int = 1
 val b

    = 1 // `Int` type is inferred var x = 5 // `Int` type is inferred
 x += 1 Inferred values Mutable values val : constant value - IMMUTABLE var : variable value - MUTABLE USE VAL AS MUCH AS POSSIBLE ! #androiddev #kotlin #morningtech @ekito
  7. Safety with Optionals var stringA: String = "foo"
 stringA =

    null //Compilation error - stringA is a String (non optional)
 
 var stringB: String? = "bar" // stringB is an Optional String
 stringB = null //ok Optional value #androiddev #kotlin #morningtech @ekito
  8. Late initialization, Lazy, Delegates … // set length default value

    manually
 val length = if (stringB != null) stringB.length else -1
 //or with the Elvis operator
 val length = stringB?.length ?: -1 Default Value & Elvis Operator val length = stringB.length // Compilation error - stringB can be null !
 // use ? the safe call operator
 val length = stringB?.length //Value or null - length is type Int? val length = stringB!!.length // Value or explicit throw NPE - length is type Int Safe call with ?. or Explicit call with !!. #androiddev #kotlin #morningtech @ekito
  9. Class class User (
 val userName: String,
 val firstName: String,


    val lastName: String,
 var location: Point? = null
 ) POJO + - Getter - Setter - Constructors #androiddev #kotlin #morningtech @ekito public / closed by default
  10. Data Class data class User (
 val userName: String,
 val

    firstName: String,
 val lastName: String,
 var location: Point? = null
 ) POJO + - Getter - Setter - Constructors - toString - hashcode - equals - copy #androiddev #kotlin #morningtech @ekito
  11. Properties // readonly property
 val isEmpty: Boolean
 get() = this.size

    == 0 Properties can be declared in constructor or in class You can also handle getter & setter // customer getter & setter
 var stringRepresentation: String set(value) {
 … } class ApiKey(var weatherKey: String, var geocodeKey: String){
 var debug : Boolean = false
 } #androiddev #kotlin #morningtech @ekito
  12. Object Component // singleton
 object Resource {
 val name =

    "Name"
 } class StringCalculator{ // class helper
 companion object{
 val operators = arrayOf("+","-","x","/")
 }
 } Singleton Class Companion Object #androiddev #kotlin #morningtech @ekito
  13. Example data class User(val name: String = "", val age:

    Int = 0) val jack = User(name = "Jack", age = 1) //no new keyword
 val anotherJack = jack.copy(age = 2) Data Class usage A simple GSon Class #androiddev #kotlin #morningtech @ekito
  14. When when (s) {
 1 -> print("x == 1")
 2

    -> print("x == 2")
 else -> { // Note the block
 print("x is neither 1 nor 2")
 }
 } Flow Control (replace your old if blocks) in <range> -> is <type> -> expression -> when (x) {
 in 1..10 -> print("x is in the range")
 in validNumbers -> print("x is valid")
 !in 10..20 -> print("x is outside the range")
 else -> print("none of the above")
 } Pattern Matching #androiddev #kotlin #morningtech @ekito * can match with operators : in, as, is, range …
  15. Collections // immutable map
 val map = mapOf("a" to 1,

    "b" to 2, "c" to 3)
 for ((k, v) in map) {
 println("$k -> $v")
 } 
 map2["a"] = "my value" // direct map access with array style // range
 for (i in 1..100) { //... } #androiddev #kotlin #morningtech @ekito // immutable list
 val list = listOf("a", "b", "c","aa")
 list.filter { it.startsWith("a") } * collections operators : map, filter, take, flatMap, forEach, firstOrNull, last …
  16. InterOp object UserSingleton{
 fun stringify(user : User) : String{
 val

    (name,age) = user
 return "[name=$name][age=$age]"
 }
 }
 
 fun WhatIsyourAge(user : User){
 println("Your age is ${user.age}")
 }
 
 data class User (val name: String, val age : Int){
 companion object{
 fun sayHello(user : User){
 println("Hello ${user.name}")
 }
 }
 } User u = new User("toto",42);
 User.Companion.sayHello(u);
 UserUtilsKt.WhatIsyourAge(u);
 System.out.println("stringify : "+UserSingleton.INSTANCE.stringify(u)); Kotlin code Calling Kotlin from Java #androiddev #kotlin #morningtech @ekito
  17. 9:00 - Introduction 9:05 - Intro to Kotlin part 1

    9:25 - Project presentation & setup 9:35 - Hands-on part 1 (55 minutes) 10:30 - Coffee break 10:45 - Intro to Kotlin part 2 11:00 - Hands-on part 2 (55 minutes) 11:55 - Final Part #androiddev #kotlin #morningtech @ekito Hands-on !
  18. 9:00 - Introduction 9:05 - Intro to Kotlin part 1

    9:25 - Project presentation & setup 9:35 - Hands-on part 1 (55 minutes) 10:30 - Coffee break 10:45 - Intro to Kotlin part 2 11:00 - Hands-on part 2 (55 minutes) 11:55 - Final Part #androiddev #kotlin #morningtech @ekito Coffee Break !
  19. Kotlin’s Android Extensions apply plugin: 'com.android.application' apply plugin: ‘kotlin-android’ apply

    plugin: ‘kotlin-android-extensions’ // if use extensions #androiddev #kotlin #morningtech @ekito
  20. Functions fun reformat(str: String,
 normalizeCase: Boolean = true,
 upperCaseFirstLetter: Boolean

    = true,
 wordSeparator: Char = ' '): String {
 
 } Named Parameters & default values reformat(str, true, true, '_') // old way to call
 reformat(str, wordSeparator = '_') // using default values & named params fun String.hello(): String = "Hello " + this val hi = "Arnaud !".hello()
 println("$hi") // Hello Arnaud ! Extension #androiddev #kotlin #morningtech @ekito
  21. Lambdas val fab = findViewById(R.id.fab) as FloatingActionButton
 fab.setOnClickListener { view

    -> popLocationDialog(view) } A lambda expression or an anonymous function is a “function literal”, i.e. a function that is not declared, but passed immediately as an expression - A lambda expression is always surrounded by curly braces - Its parameters (if any) are declared before -> (parameter types may be omitted), - The body goes after -> (when present). myNumber.split("\n").flatMap { it.split(separator) }
 .map(Integer::parseInt)
 .map(::checkPositiveNumber)
 .filter { it <= 1000 }
 .sum() #androiddev #kotlin #morningtech @ekito * Method references are not surrounded by curly braces
  22. 9:00 - Introduction 9:05 - Intro to Kotlin part 1

    9:25 - Project presentation & setup 9:35 - Hands-on part 1 (55 minutes) 10:30 - Coffee break 10:45 - Intro to Kotlin part 2 11:00 - Hands-on part 2 (55 minutes) 11:55 - Final Part #androiddev #kotlin #morningtech @ekito Hands-on !