Why Kotlin is your next
language?
theory and practice
Aliaksei Zhynhiarouski
1
Dev Day MiniQ, 2016
Kotlin Island
2
Why is Kotlin
• Static Typing bit.ly/st-vs-dyn
• Java + Kotlin = ❤. 

Effortless mixing both in one project
• Java Interoperability. 

100% interoperable with Java.
3
Why is Kotlin
• Null Safety
• Type Inference
• Immutability in the mind
• fun
4
fun main(args : Array<String>) {
println("Hello, MiniQ!")
}
5
val from_value : Type
var from_variable : Type
val i_am_string = “mobile”
var i_am_long = 666L
val i_am_double = 3.14e10
6
val & var
Null Safety
// can’t be null

val foo: String = “Dev Day”


// need always perform the check 

val bar: String? = null
7
Type? = Type or null
Null Safety
val bar: String? = “Dev Day”


var a = bar?.length // 6



var b = bar?.length?.inc() // 7



var c = bar!!.length // can be NPE
8
Null Safety
val bar: String? = null


var a = if (bar != null) bar.length

else 0 // 0



var b = bar?.length ?: 0 // 0

9
Type Definition
class Phone(val brand: String)
10
• concise syntax for constructor
• properties – not fields
• final by default. Use open to open
• simple old java class under the hood
Type Definition
class Phone(val brand: String){
var version: Int = 0
}
11
get() {…}

private set
val phone = Phone(“Apple”)

phone.brand == “Apple” // true
Value Object
data class Phone(val brand: String)
12
toString()
hashCode()
equals()

copy()
Get ready to be inspired
13
Extensions
14
// Usage Example



“MiniQ”.lastChar() // “Q”

// Definition



fun String.lastChar():Char 

= this.get(length - 1)
Extensions
15
// Java under the hood



@file:JvmName(“StringUtils")

StringUtils.lastChar(“Mobile”);
Extensions
16
Collections.max(list)



↓
list.max()
Extensions
17
operator fun BigDecimal.inc() 

= this + BigDecimal.ONE


// Example

var counter = BigDecimal.ZERO



print(++counter) // 1
Extensions
18
“25”.toInt() // Int
“8.$minor.5”.toOsVersion() // to object
Android Extensions
19
val text = find<TextView>(R.id.text)
Just extend Activity and have fun
inline fun <reified T : View> 

Activity.find(id: Int): T = this.findViewById(id) as T
final TextView text = (TextView) v.findViewById(R.id.text);
Lambdas
20
val boys = listOf(

Boy(“Alex”), Boy(“Petr”), Boy(“Oleg”))

// 1 

boys.filter({ b: Boy -> b.age > 18 })

// 2

boys.filter({ it.age > 18 })


// 3

boys.filter { it.age > 18 }
λ
21
boys.filter { it.age > 18 }
.map { Pair(it, Boy("Eugene")) }
.forEach { dance(it) }
// Definition



inline fun <T> Iterable<T>.filter

(predicate: (T) -> Boolean)

λ
22
db.inTransaction {

delete(“users”, “name = ?”, arrayOf(“Alex”))

}
fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) {
beginTransaction()
try {

func()

setTransactionSuccessful()
} finally {
endTransaction()
}
}
Delegates – right way
23
class View {















}
val lazyProp by lazy { “Dev Day” }
val ops by observable(“”) { 

prop, old, new ->
print("$old to $new")
}
Delegates – wow way
24
class Activity {













}
private val btn: Button by lazy {

findViewById(R.id.btn) as Button

}



override fun onCreate(savedBundle: Bundle?) {

btn.setText(“MiniQ!”)

}


Delegates – wow way
25
class Query(val props: Map<String, String>) {



}
val category by props

val model by props



val info: String

get() {

return “$category - $model” 

}
Delegates – wow way
26
class Query(val props: Map<String, String>) {



}
val category by props

val model by props

…

val props = mapOf(“category” to “XXX”,

“model” to “YYY”)

val query = Query(props)
print(query.info) // “XXX - YYY”

DSL
27
• Type-safe
• Express your code by flexible syntax
• Ideal to build own query engine
• if/for/when just inside DSL
DSL
28
"(#C1 = :active) AND (#C2 = :type) AND " +
"(attribute_not_exists(#C1) OR #C1 IN
(:model, :allModels)) AND " +

"...";

if (smth)

append("(#C2 = :active) AND NOT
contains(#C3, :brandAll)");
…
// wait, oh shi~
DSL
29
val expr = filterExpr {

group {

eq("#1", ":2") and eq("#1", ":2") 

or group {

eq("#2", ":2")

if (smth) { 

and eq("#2", ":2") 

}

}

and ……

}
One more DSL thing
30
Gradle 3 meets Kotlin
Kotlin 1.1
typealias Callback<T> = (T) -> T
// And now

fun alias(cb: Callback<String>) {}
31
Type aliases
Kotlin 1.1
typealias Table<K> = 



MutableMap<K, MutableList<String>>
32
Type aliases
Kotlin 1.1
val future = async<String> {
(1..5).map {
await(loooongAsyncOperation(it))



}.joinToString("n")
}
33
Coroutines with async/await
Why is Kotlin
• Use all existing Java frameworks and
libraries
• Code reviews are not a problem
• Suitable for enterprise Java
• Adopting is low risk
34
Why is Kotlin
• Android
• Gradle
• Can be learned in a few hours
• Kotlin also compiles to JavaScript ;)
35
http://try.kotl.in
36
Links
Awesome Kotlin kotlin.link
Slack kotlinlang.slack.com 

Local’s Chat gitter.im/JavaBy/Kotlin

37
Links just for you
Kotlin compilation speed

Performance: Kotlin Bytecode
https://www.youtube.com/watch?v=eQ4YHpAXdp4

Experience of Square with Kotlin. Good analysis

Android Development advanced

https://vimeo.com/144877458

Kotlin in real project with a lot of nuances

https://www.youtube.com/watch?v=CABN2r4GPpQ
38
Kotlin friends
39
jprof.by
bkug.by
Go v Minsk, ja sozdal

Why Kotlin is your next language?

  • 1.
    Why Kotlin isyour next language? theory and practice Aliaksei Zhynhiarouski 1 Dev Day MiniQ, 2016
  • 2.
  • 3.
    Why is Kotlin •Static Typing bit.ly/st-vs-dyn • Java + Kotlin = ❤. 
 Effortless mixing both in one project • Java Interoperability. 
 100% interoperable with Java. 3
  • 4.
    Why is Kotlin •Null Safety • Type Inference • Immutability in the mind • fun 4
  • 5.
    fun main(args :Array<String>) { println("Hello, MiniQ!") } 5
  • 6.
    val from_value :Type var from_variable : Type val i_am_string = “mobile” var i_am_long = 666L val i_am_double = 3.14e10 6 val & var
  • 7.
    Null Safety // can’tbe null
 val foo: String = “Dev Day” 
 // need always perform the check 
 val bar: String? = null 7 Type? = Type or null
  • 8.
    Null Safety val bar:String? = “Dev Day” 
 var a = bar?.length // 6
 
 var b = bar?.length?.inc() // 7
 
 var c = bar!!.length // can be NPE 8
  • 9.
    Null Safety val bar:String? = null 
 var a = if (bar != null) bar.length
 else 0 // 0
 
 var b = bar?.length ?: 0 // 0
 9
  • 10.
    Type Definition class Phone(valbrand: String) 10 • concise syntax for constructor • properties – not fields • final by default. Use open to open • simple old java class under the hood
  • 11.
    Type Definition class Phone(valbrand: String){ var version: Int = 0 } 11 get() {…}
 private set val phone = Phone(“Apple”)
 phone.brand == “Apple” // true
  • 12.
    Value Object data classPhone(val brand: String) 12 toString() hashCode() equals()
 copy()
  • 13.
    Get ready tobe inspired 13
  • 14.
    Extensions 14 // Usage Example
 
 “MiniQ”.lastChar()// “Q”
 // Definition
 
 fun String.lastChar():Char 
 = this.get(length - 1)
  • 15.
    Extensions 15 // Java underthe hood
 
 @file:JvmName(“StringUtils")
 StringUtils.lastChar(“Mobile”);
  • 16.
  • 17.
    Extensions 17 operator fun BigDecimal.inc()
 = this + BigDecimal.ONE 
 // Example
 var counter = BigDecimal.ZERO
 
 print(++counter) // 1
  • 18.
  • 19.
    Android Extensions 19 val text= find<TextView>(R.id.text) Just extend Activity and have fun inline fun <reified T : View> 
 Activity.find(id: Int): T = this.findViewById(id) as T final TextView text = (TextView) v.findViewById(R.id.text);
  • 20.
    Lambdas 20 val boys =listOf(
 Boy(“Alex”), Boy(“Petr”), Boy(“Oleg”))
 // 1 
 boys.filter({ b: Boy -> b.age > 18 })
 // 2
 boys.filter({ it.age > 18 }) 
 // 3
 boys.filter { it.age > 18 }
  • 21.
    λ 21 boys.filter { it.age> 18 } .map { Pair(it, Boy("Eugene")) } .forEach { dance(it) } // Definition
 
 inline fun <T> Iterable<T>.filter
 (predicate: (T) -> Boolean)

  • 22.
    λ 22 db.inTransaction {
 delete(“users”, “name= ?”, arrayOf(“Alex”))
 } fun SQLiteDatabase.inTransaction(func: SQLiteDatabase.() -> Unit) { beginTransaction() try {
 func()
 setTransactionSuccessful() } finally { endTransaction() } }
  • 23.
    Delegates – rightway 23 class View {
 
 
 
 
 
 
 
 } val lazyProp by lazy { “Dev Day” } val ops by observable(“”) { 
 prop, old, new -> print("$old to $new") }
  • 24.
    Delegates – wowway 24 class Activity {
 
 
 
 
 
 
 } private val btn: Button by lazy {
 findViewById(R.id.btn) as Button
 }
 
 override fun onCreate(savedBundle: Bundle?) {
 btn.setText(“MiniQ!”)
 } 

  • 25.
    Delegates – wowway 25 class Query(val props: Map<String, String>) {
 
 } val category by props
 val model by props
 
 val info: String
 get() {
 return “$category - $model” 
 }
  • 26.
    Delegates – wowway 26 class Query(val props: Map<String, String>) {
 
 } val category by props
 val model by props
 …
 val props = mapOf(“category” to “XXX”,
 “model” to “YYY”)
 val query = Query(props) print(query.info) // “XXX - YYY”

  • 27.
    DSL 27 • Type-safe • Expressyour code by flexible syntax • Ideal to build own query engine • if/for/when just inside DSL
  • 28.
    DSL 28 "(#C1 = :active)AND (#C2 = :type) AND " + "(attribute_not_exists(#C1) OR #C1 IN (:model, :allModels)) AND " +
 "...";
 if (smth)
 append("(#C2 = :active) AND NOT contains(#C3, :brandAll)"); … // wait, oh shi~
  • 29.
    DSL 29 val expr =filterExpr {
 group {
 eq("#1", ":2") and eq("#1", ":2") 
 or group {
 eq("#2", ":2")
 if (smth) { 
 and eq("#2", ":2") 
 }
 }
 and ……
 }
  • 30.
    One more DSLthing 30 Gradle 3 meets Kotlin
  • 31.
    Kotlin 1.1 typealias Callback<T>= (T) -> T // And now
 fun alias(cb: Callback<String>) {} 31 Type aliases
  • 32.
    Kotlin 1.1 typealias Table<K>= 
 
 MutableMap<K, MutableList<String>> 32 Type aliases
  • 33.
    Kotlin 1.1 val future= async<String> { (1..5).map { await(loooongAsyncOperation(it))
 
 }.joinToString("n") } 33 Coroutines with async/await
  • 34.
    Why is Kotlin •Use all existing Java frameworks and libraries • Code reviews are not a problem • Suitable for enterprise Java • Adopting is low risk 34
  • 35.
    Why is Kotlin •Android • Gradle • Can be learned in a few hours • Kotlin also compiles to JavaScript ;) 35
  • 36.
  • 37.
  • 38.
    Links just foryou Kotlin compilation speed Performance: Kotlin Bytecode https://www.youtube.com/watch?v=eQ4YHpAXdp4 Experience of Square with Kotlin. Good analysis Android Development advanced https://vimeo.com/144877458 Kotlin in real project with a lot of nuances https://www.youtube.com/watch?v=CABN2r4GPpQ 38
  • 39.
  • 40.
    Go v Minsk,ja sozdal