kotlin hands on - morningtech ekito 2017

58
Develop a weather app with K

Upload: arnaud-giuliani

Post on 11-Apr-2017

45 views

Category:

Technology


1 download

TRANSCRIPT

Develop a weather app

with K

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

Intro to part 1

#androiddev #kotlin #morningtech @ekito

« production ready »15.02.2016

#androiddev #kotlin #morningtech @ekito

#androiddev #kotlin #morningtech @ekito

Kotlin 1.1.1 @ 15.03.2017

Yet another JVM Language ?

#androiddev #kotlin #morningtech @ekito

The new « Swift » for Android ?

#androiddev #kotlin #morningtech @ekito

#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

18

Let’s Go ! #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

Working with optional values

#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

POJO ?

Kotlin

Java

#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

ExampleAndroid Page Adapter

Pattern Matching

#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

Example

Kotlin Collection

Java 7 Collection

#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

Project presentation & setup

#androiddev #kotlin #morningtech @ekito

My Weather app

#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

Hands-on part 1

#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 !

Intro to part 2

#androiddev #kotlin #morningtech @ekito

Sweet stuffs for

#androiddev #kotlin #morningtech @ekito

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

Kotlin

Java

#androiddev #kotlin #morningtech @ekito

* In Fragment : onViewCreated()

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

Extensions Functions

Extension declaration

Usage

#androiddev #kotlin #morningtech @ekito

Reactive Programming

#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

Example - Rx/RetrofitKotlin

Java

#androiddev #kotlin #morningtech @ekito

Hands-on part 2

#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 !

Final Part

#androiddev #kotlin #morningtech @ekito

#androiddev #kotlin #morningtech @ekito

Time is over !

Smarter development for the JVM

Kotlin

#androiddev #kotlin #morningtech @ekito

Thank you for coming

#androiddev #kotlin #morningtech @ekito