kotlin hands on - morningtech ekito 2017
TRANSCRIPT
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 211:00 - Hands-on part 2 (55 minutes)11:55 - Final Part
#androiddev #kotlin #morningtech @ekito
Practical notes
https://github.com/Ekito/2017-handson-kotlinAndroid
Grab your stuff !
#androiddev #kotlin #morningtech @ekito
@Baresse
Work @ ekito
Developer & Geek
Fullstack & MobileLaurent BARESSE
@arnogiu
Work @ ekito
Core & Gear Maker
Mobile & CloudArnaud GIULIANI
#androiddev #kotlin #morningtech @ekito
https://www.ekito.fr/careers
Join the team !
#androiddev #kotlin #morningtech @ekito
What’sKotlin ?
- Fully open source (built by Jetbrains)
- Run on Java 6+
- Static typing & type inference
- Modern language features
- 1st grade tooling
#androiddev #kotlin #morningtech @ekito
How K can help you ?
- Conciseness
- Null Safety & Immutability protection
- Static Typing & Smart Casts
- Open programming styles (lambdas, high order functions …)
- Java Interop
#androiddev #kotlin #morningtech @ekito
More AboutKotlin …
- 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
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
is Kotlin Android friendly ?
https://github.com/SidneyXu/AndroidDemoIn4Languages
Method counts by Language
#androiddev #kotlin #morningtech @ekito
KOTLIN is not just about writing your app with lesser lines.
It’s all about writing SAFER & BETTER APPS !
#androiddev #kotlin #morningtech @ekito
Typing & Inference
val a: Int = 1val 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
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 StringstringB = null //ok
Optional value
#androiddev #kotlin #morningtech @ekito
// 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
Example
Null check safety & Smart cast
Securing with default values
#androiddev #kotlin #morningtech @ekito
Class
class User ( val userName: String, val firstName: String, val lastName: String, var location: Point? = null )
POJO + - Getter- Setter- Constructors
public / closed by default
#androiddev #kotlin #morningtech @ekito
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
Properties
// readonly propertyval isEmpty: Boolean get() = this.size == 0
Properties can be declared in constructor or in class
You can also handle getter & setter
// customer getter & settervar stringRepresentation: String
set(value) { … }
class ApiKey(var weatherKey: String, var geocodeKey: String){ var debug : Boolean = false}
* Late initialization, Lazy, Delegates … #androiddev #kotlin #morningtech @ekito
Example
data class User(val name: String = "", val age: Int = 0)
val jack = User(name = "Jack", age = 1) //no new keywordval anotherJack = jack.copy(age = 2)
Data Class usage
A simple GSon Class
#androiddev #kotlin #morningtech @ekito
Object Class
// singleton object Resource { val name = "Name"}
class StringCalculator{ // class helper companion object{ val operators = arrayOf("+","-","x","/") } }
Singleton Class
Companion Object
#androiddev #kotlin #morningtech @ekito
When
in <range> ->is <type> ->
expression ->
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)
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
* can match with operators : in, as, is, range …
#androiddev #kotlin #morningtech @ekito
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) { //... }
// immutable listval list = listOf("a", "b", "c","aa") list.filter { it.startsWith("a") }
* collections operators : map, filter, take, flatMap, forEach, firstOrNull, last …
#androiddev #kotlin #morningtech @ekito
InterOp Java/Kotlin
object UserSingleton{ fun stringify(user : User) : String{ // … } }
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){ //… } } }
User u = new User("toto",42); User.Companion.sayHello(u);
UserUtilsKt.WhatIsyourAge(u);
UserSingleton.INSTANCE.stringify(u)
#androiddev #kotlin #morningtech @ekito
Get the project
#androiddev #kotlin #morningtech @ekito
https://github.com/Ekito/2017-handson-kotlinAndroid
Create your branch
#androiddev #kotlin #morningtech @ekito
https://github.com/Ekito/2017-handson-kotlinAndroid/blob/master/README.pdf
MainApplication MainActivity
DailyForecastModel
DialogHelper
WeatherSDKUtil
WeatherSDK
#androiddev #kotlin #morningtech @ekito
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 211:00 - Hands-on part 2 (55 minutes)11:55 - Final Part
Hands-on !
#androiddev #kotlin #morningtech @ekito
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 211:00 - Hands-on part 2 (55 minutes)11:55 - Final Part
#androiddev #kotlin #morningtech @ekito
Coffee Break !
Kotlin’s Android Extensions
apply plugin: 'com.android.application'apply plugin: ‘kotlin-android’
apply plugin: ‘kotlin-android-extensions’ // if use extensions
In your build.gradle
#androiddev #kotlin #morningtech @ekito
Lambdas
val fab = findViewById(R.id.fab) as FloatingActionButtonfab.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()
* Method references are not surrounded by curly braces !
#androiddev #kotlin #morningtech @ekito
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
#androiddev #kotlin #morningtech @ekito
Lamba expressions
Functional Programming
Reactive Streams
http://reactivex.io/documentation/operators.html
http://www.reactive-streams.org/
https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape
#androiddev #kotlin #morningtech @ekito
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 211:00 - Hands-on part 2 (55 minutes) 11:55 - Final Part
#androiddev #kotlin #morningtech @ekito
Hands-on !