Smarter development for the JVM
#GeekBreakFast
Kotlin
@arnogiu
Work @ ekito
App & Gear Maker
Mobile & Cloud DevArnaud GIULIANI
3
« production ready »15.02.2016
Yet another JVM Language ?
Limits of java- Verbose
- Type inference
- No properties / Lazy / Delegate
- Checked exception
- NullPointerException
- Extensibility
- End of lines with ;
https://goo.gl/HIrmC9 @sdeleuze
But Java is great …
- Fast
- Optimized bytecode
- Static typing
- Simple to learn
- Amazing ecosystem
Today’s ITChallenge
Responsive
Resilient
Scalable
Productive
(not only) Functional programming
First class functions, immutability, no side effects,
conciseness …
11
Ready for Reactive Programming
How K can help you ?
- Conciseness
- Null Safety & Immutability protection
- Static Typing & Smart Casts
- Open programming styles (lambdas, high order functions …)
- Java interop
What’sKotlin ?
- Fully open source (built by Jetbrains)
- Run on Java 6+
- Static typing & type inference
- Modern language features
- 1st grade tooling
What’s insideKotlin ?
- 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
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
Use Cases
Source : poll on Kotlin Slack (early 2016)https://goo.gl/HIrmC9 @sdeleuze
17
Want some nougat ?
19
20
is Kotlin Android friendly ?
https://github.com/SidneyXu/AndroidDemoIn4Languages
Method counts by Language
Where to use Kotlin ?*
*everywhere you use Java
22
let’s go write some Kotlin !
Ready to useEasy to run
24
Getting started with gradle
buildscript { ext.kotlin_version = '<version to use>'
dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" }}
apply plugin: "kotlin"
dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"}
1.0.5-2
also available with maven
25
IntelliJ
26
Gradle tips for Kotlin
# Gradle org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.deamon=true # Kotlin kotlin.incremental=true # Android Studio 2.2+android.enableBuildCache=true
In your gradle.properties
https://medium.com/keepsafe-engineering/kotlin-vs-java-compilation-speed-e6c174b39b5d#.k44v7axsk
Smarter development
with K
29
Typing & Inference
val a: Int = 1val b = 1 // `Int` type is inferred
var x = 5 // `Int` type is inferred x += 1
Infered values
Mutable values
val : constant value - IMMUTABLE var : variable value - MUTABLE
USE VAL AS MUCH AS POSSIBLE !
30
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
31
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 !!.
32
Example
33
Class
class User ( var userName: String, var firstName: String, var lastName: String, var location: Point? = null )
POJO + - Getter- Setter- Constructors
34
Data Class
data class User ( var userName: String, var firstName: String, var lastName: String, var location: Point? = null )
POJO + - Getter- Setter- Constructors- toString- hashcode- equals- copy
35
POJO ?
36
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 get() = this.toString() set(value) { setDataFromString(value) // parses the string and assigns values to other properties }
class ApiKey(var weatherKey: String, var geocodeKey: String){ var debug : Boolean = false}
37
Object Component
// singleton object Resource { val name = "Name"}
println(" my resource is : ${Resource.name}")
class StringCalculator{ // class helper companion object{ val operators = arrayOf("+","-","x","/") } }
println(" my operators are : ${StringCalculator.operators}")
Singleton Class
Companion Object
38
Example
data class User(val name: String = "", val age: Int = 0)
val jack = User(name = "Jack", age = 1) val anotherJack = jack.copy(age = 2)
json class
data class usage
39
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)
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
in <range> ->is <type> ->
expression ->
when (s) { is String -> print("s is a string") else -> print("s is not a string") }
40
Example
41
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
42
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).
numberString.split("\n").flatMap { it.split(separator) } .map(Integer::parseInt) .map(::checkPositiveNumber) .filter { it <= 1000 } .sum()
43
Destructuring Data
fun extractDelimiter(input: String): Pair<String, String> = …
val (separator, numberString) = extractDelimiter(input)
data class User(var name : String,var age : Int)
val toto = User("toto",42) val (name,age) = toto
Returning two values with Pair
Destructured values with data classes
44
Collections
// immutable listval list = listOf("a", "b", "c","aa") list.filter { it.startsWith("a") }
// immutable map val map = mapOf("a" to 1, "b" to 2, "c" to 3) for ((k, v) in map) { println("$k -> $v") }// mutable map val map2 = HashMap<String,String>()// direct map access map2["a"] = "my value"println(map2["a"])
// range for (i in 1..100) { //... }
45
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
Sweet stuffs for
47
Kotlin’s Android Extensions
android { ... sourceSets { main.java.srcDirs += 'src/main/kotlin' }}
apply plugin: 'com.android.application'apply plugin: ‘kotlin-android’
apply plugin: ‘kotlin-android-extensions’ // if use extensions
In your build.gradle
Kotlin
Java
Anko - Android DSL
Async task in few lines
doAsync { // Long background task uiThread { result.text = "Done" }}
Layout DSL
verticalLayout { val name = editText() button("Say Hello") { onClick { toast("Hello, ${name.text}!") } }}
https://github.com/Kotlin/anko
One of our longest journey …
Reactive Programming
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
54
Example - Rx/RetrofitKotlin
Java
55
Example - Rx/Realm
56
Just another hype JVM stuff ?
57
Ready to go ?
58
Production ready ?
59
Always hard to start …
60
Our feedback with K
- Easy to start small & grow (no big bang)
- Tool support is very good
- Great feedback about the language itself
- Stable in production !
- Magical conversion … but take care
- Hard to come back to java …
61
IF YOU DON'T LOOK AT JAVA AND THINK, "THIS
COULD BE BETTER", DON'T SWITCH.
@RunChristinaRun
62
Learning Kotlin
63
Try Kotlin online http://try.kotlinlang.org/#/Examples/
Kotlin Referencehttps://kotlinlang.org/docs/reference/
Kotlin Cheat Sheet (by ekito)http://www.slideshare.net/arnaudgiuliani/kotlin-
cheat-sheet-by-ekito
Kotlin Communityhttps://kotlinlang.org/community.html
64
Kotlin 1.1
Thank you :)