Kotlin: A pragmatic language by JetBrains

74
Kotlin A pragmatic language for JVM and Android

Transcript of Kotlin: A pragmatic language by JetBrains

Page 1: Kotlin: A pragmatic language by JetBrains

Kotlin

A pragmatic language for JVM and Android

Page 2: Kotlin: A pragmatic language by JetBrains

What if I told you that

you already know Kotlin

Page 3: Kotlin: A pragmatic language by JetBrains

But who am I?

@jigargosar

Page 4: Kotlin: A pragmatic language by JetBrains
Page 5: Kotlin: A pragmatic language by JetBrains
Page 6: Kotlin: A pragmatic language by JetBrains
Page 7: Kotlin: A pragmatic language by JetBrains
Page 8: Kotlin: A pragmatic language by JetBrains
Page 9: Kotlin: A pragmatic language by JetBrains
Page 10: Kotlin: A pragmatic language by JetBrains
Page 11: Kotlin: A pragmatic language by JetBrains

I am anAgile Coach

And Code Doctor

Page 12: Kotlin: A pragmatic language by JetBrains

Conventions used in this talk

● Never == Almost Never● Always == Almost always● same goes for right, wrong, good, bad, 100%, 0%

Page 13: Kotlin: A pragmatic language by JetBrains

What if I told you that

you already know Kotlin

Page 14: Kotlin: A pragmatic language by JetBrains

Hello Kotlin

fun main(args: Array<String>) { println("Hello Kotlin!")}

Page 15: Kotlin: A pragmatic language by JetBrains

What is Kotlin?a pragmatic programming

language for JVM and Android

Combines OO and functional features

Focused on

● interoperability● safety ● clarity ● tooling support

Page 16: Kotlin: A pragmatic language by JetBrains

Kotlin works everywhere where Java works

Page 17: Kotlin: A pragmatic language by JetBrains

Kotlin works everywhere where Java works

● Server-side applications● Mobile applications (Android)● Desktop applications● Works with all major tools and services such as

○ IntelliJ IDEA, Android Studio and Eclipse○ Maven, Gradle and Ant○ Spring Boot○ GitHub, Slack and even Minecraft

Page 18: Kotlin: A pragmatic language by JetBrains

Key focus is on interoperability and seamless support for mixed Java+Kotlin projects

Page 19: Kotlin: A pragmatic language by JetBrains

Is it mature enough and ready for

production?

Page 20: Kotlin: A pragmatic language by JetBrains

Is it ready for production?

● Yes. And for quite some time.

● JetBrains, have been using Kotlin in real-life projects on

a rather extensive scale over the last two years.

● Over 500K lines of Kotlin code in projects such as IntelliJ IDEA and Rider.

● In addition, there are quite a few companies that have been using Kotlin in production for some time now.

Page 21: Kotlin: A pragmatic language by JetBrains

Who’s behind Kotlin?

Page 22: Kotlin: A pragmatic language by JetBrains

First and foremost, Kotlin is an Open Source language

Page 23: Kotlin: A pragmatic language by JetBrains

Open Source language

● Developed on GitHub ● Under Apache 2.0 Open-Source license

● Over 100 contributors to date

● Adoption: 2 million+ Kotlin LOC on GitHub

Page 24: Kotlin: A pragmatic language by JetBrains

BUT JetBrains is the main backer of Kotlin

Page 25: Kotlin: A pragmatic language by JetBrains
Page 26: Kotlin: A pragmatic language by JetBrains

Why Kotlin?

Concise, Safe, Versatile, Interoperable, Tooling

Page 27: Kotlin: A pragmatic language by JetBrains

ConciseDrastically reduce the amount of boilerplate code you need to write.

Page 28: Kotlin: A pragmatic language by JetBrains

Concise

Create a POJO with getters, setters, equals(), hashCode(), toString() and copy() in a single line:

data class Customer(val name: String, val email: String, val company: String)

Page 29: Kotlin: A pragmatic language by JetBrains

Concise

Or filter a list using a lambda expression:

val positiveNumbers = list.filter {it > 0}

Page 30: Kotlin: A pragmatic language by JetBrains

Concise

Want a Singleton? Create an object:

object ThisIsASingleton {

val companyName: String = "JetBrains"

}

Page 31: Kotlin: A pragmatic language by JetBrains

SafeAvoid entire classes of errors such as null pointer exceptions.

Page 32: Kotlin: A pragmatic language by JetBrains

SAFE

Get rid of those pesky NullPointerExceptions, you know, The Billion Dollar Mistake

var output : Stringoutput = null // compilation error

And of course, Kotlin protects you from mistakenly operating on nullable types, including those from Java

println(output.length()) // compilation error

Page 33: Kotlin: A pragmatic language by JetBrains

SAFE

And if you check a type is right, the compiler will auto-cast it for you

fun calculateTotal(obj: Any) { if (obj is Invoice) { obj.calculateTotal() }}

Page 34: Kotlin: A pragmatic language by JetBrains

VersatileBuild server-side applications, Android apps or frontend code running in the browser.

Page 35: Kotlin: A pragmatic language by JetBrains

Versatile

Multi-purpose language allowing you to build any type of application

● Android Development: No performance impact. Very small runtime.● JavaScript: Write code in Kotlin and target JavaScript to run on Node.js or in

browser● Web: Whether you want strongly typed HTML, CSS builders or just plain web

development.● Application Server

○ The technology doesn't matter. 100% compatible with all JVM frameworks.

● Enterprise: Use Kotlin for any type of Enterprise Java EE development.

Page 36: Kotlin: A pragmatic language by JetBrains

InteroperableLeverage existing frameworks and libraries of the JVM with 100% Java Interoperability.

Page 37: Kotlin: A pragmatic language by JetBrains

Create and consume Java code at will

class NettyHandler: ChannelInboundMessageHandlerAdapter<Any>() {

override fun messageReceived(p0: ChannelHandlerContext?, p1: Any?) { throw UnsupportedOperationException() }}

Or use any existing library on the JVM, as there’s 100% compatibility, including SAM support.

Interoperable

Page 38: Kotlin: A pragmatic language by JetBrains

Interoperable

Target either the JVM or JavaScript. Write code in Kotlin and decide where you want to deploy to

import js.dom.html.*

fun onLoad() { window.document.body.innerHTML += "<br/>Hello, Kotlin!"}

Page 39: Kotlin: A pragmatic language by JetBrains

ToolingCommand Line Compiler or First Class IDE Support. Freedom to choose.

Page 40: Kotlin: A pragmatic language by JetBrains

Basics

Let’s look at real code

Page 41: Kotlin: A pragmatic language by JetBrains

Functions

fun sum(a: Int, b: Int): Int {

return a + b

}

fun sum(a: Int, b: Int) = a + b

fun printSum(a: Int, b: Int): Unit {

print(a + b)

}

Page 42: Kotlin: A pragmatic language by JetBrains

Variables

val a: Int = 1

val b = 1 // `Int` type is inferred

val c: Int // Type required when no initializer

// is provided

c = 1 // definite assignment

var x = 5 // `Int` type is inferred

x += 1

Page 43: Kotlin: A pragmatic language by JetBrains

String Interpolation & docstring

val i = 10

val s = "i = $i" // evaluates to "i = 10"

val s = "abc"

val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"

val price = """

${'$'}9.99

"""

Page 44: Kotlin: A pragmatic language by JetBrains

Conditional Expression

fun max(a: Int, b: Int): Int {

if (a > b)

return a

else

return b

}

fun max(a: Int, b: Int) = if (a > b) a else b

Page 45: Kotlin: A pragmatic language by JetBrains

When Expressionwhen (x) {

1 -> print("x == 1")

2 -> print("x == 2")

0, 1 -> print("x == 0 or x == 1")

parseInt(s) -> print("s encodes 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")

is String -> x.startsWith("prefix")

x.isOdd() -> print("x is odd")

x.isEven() -> print("x is even")

else -> print("otherwise")

}

Page 46: Kotlin: A pragmatic language by JetBrains

For Loop, while & do..while

for (item in collection)

print(item)

for (i in array.indices)

print(array[i])

for ((index, value) in array.withIndex()) {

println("the element at $index is $value")

}

Page 47: Kotlin: A pragmatic language by JetBrains

Collections

val immutableList = listOf(1, 2, 3)

val mutable = arrayListOf(1, 2, 3)

val immutableMap = mapOf("foo" to 1, "bar" to 2)

val readWriteMap = hashMapOf("foo" to 1, "bar" to 2)

println(map["foo"])

Page 48: Kotlin: A pragmatic language by JetBrains

Advanced

Let’s look at real code

Page 49: Kotlin: A pragmatic language by JetBrains

null safety

Page 50: Kotlin: A pragmatic language by JetBrains

Kotlin’s type system is aimed to eliminate NullPointerException’s from our code. The only possible causes of NPE’s may be:

● An explicit call to throw NullPointerException()● External Java code has caused it● There’s some data inconsistency with regard to initialization (an uninitialized

this available in a constructor is used somewhere)

Page 51: Kotlin: A pragmatic language by JetBrains

null safety

var a: String = "abc"

a = null // compilation error

val l = a.length // safe

var b: String? = "abc"

b = null // ok

val l = if (b != null) b.length else -1

val l = b.length // error: variable 'b' can be null

Page 52: Kotlin: A pragmatic language by JetBrains

null safety - Smart Cast

if (b != null && b.length > 0)

print("String of length ${b.length}")

else

print("Empty string")

Page 53: Kotlin: A pragmatic language by JetBrains

Smart Type Checks and Casts

if (obj is String) {

print(obj.length) // obj is automatically cast to String

}

if (obj !is String) { // same as !(obj is String)

print("Not a String")

}

else {

print(obj.length)

}

Page 54: Kotlin: A pragmatic language by JetBrains

Smart Type Checks and Casts

if (x !is String) return

print(x.length) // x is automatically cast to String

Page 55: Kotlin: A pragmatic language by JetBrains

“Unsafe” cast operator

val x: String = y as String // y can’t be null else CCE

val x: String? = y as String? // y can’t be Int

val x: String? = y as? String // y can be anything

Page 56: Kotlin: A pragmatic language by JetBrains

Extensions

Page 57: Kotlin: A pragmatic language by JetBrains

Extension Functions

fun String.last(): Char { return this[lastIndex]}fun String.last() = this[lastIndex]

val lastChar = "abc".last();println("lastChar = ${lastChar}")

Page 58: Kotlin: A pragmatic language by JetBrains

Nullable Receiver

fun Any?.toString(): String {

if (this == null) return "null"

return toString() // why does this compile?

}

Page 59: Kotlin: A pragmatic language by JetBrains

More about Extension

● Extensions are resolved statically● Extension Properties● Companion Object Extensions● Scope of Extensions● Declaring Extensions as Members

https://kotlinlang.org/docs/reference/extensions.html

Page 60: Kotlin: A pragmatic language by JetBrains

Motivation behind

Extensions?

Page 61: Kotlin: A pragmatic language by JetBrains

Classes and Inheritance

Page 62: Kotlin: A pragmatic language by JetBrains

Classes and Inheritanceclass Empty

class Person(firstName: String) {

init {

logger.info("Customer initialized with value ${name}")

}

}

class Person(val firstName: String, val lastName: String, var age: Int) {

// ...

}

Page 63: Kotlin: A pragmatic language by JetBrains

Classes and Inheritance

open class A {

open fun f() { print("A") }

fun a() { print("a") }

}

interface B {

// interface members are 'open' by

default

fun f() { print("B") }

fun b() { print("b") }

}

class C() : A(), B {

// The compiler requires f() to be

overridden:

override fun f() {

super<A>.f() // call to A.f()

super<B>.f() // call to B.f()

}

}

Page 64: Kotlin: A pragmatic language by JetBrains

More about Classes and Inheritance

https://kotlinlang.org/docs/reference/classes.html

Page 65: Kotlin: A pragmatic language by JetBrains

Data Classes

Page 66: Kotlin: A pragmatic language by JetBrains

Data Classes

data class User(val name: String, val age: Int)

data class User(val name: String = "", val age: Int = 0)

● equals()/hashCode() pair,

● toString() of the form "User(name=John, age=42)",

● componentN() functions corresponding to the properties in their order of declaration,

● copy() function (see below).

Page 67: Kotlin: A pragmatic language by JetBrains

Data Classes: Copying

// generated by compiler for previous class

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

val jack = User(name = "Jack", age = 1)

val olderJack = jack.copy(age = 2)

Page 68: Kotlin: A pragmatic language by JetBrains

Data Classes and Destructuring Declarations

val jane = User("Jane", 35)

val (name, age) = jane

println("$name, $age years of age")

// prints "Jane, 35 years of age"

Page 69: Kotlin: A pragmatic language by JetBrains

Generics

Page 70: Kotlin: A pragmatic language by JetBrains

Generics

class Box<T>(t: T) {

var value = t

}

val box: Box<Int> = Box<Int>(1)

val box = Box(1)

// 1 has type Int,

// so the compiler figures out that we are talking about Box<Int>

Page 71: Kotlin: A pragmatic language by JetBrains

Generics

https://kotlinlang.org/docs/reference/generics.html

Page 72: Kotlin: A pragmatic language by JetBrains

Extra

Page 73: Kotlin: A pragmatic language by JetBrains

Functions Infix Notation

val a = 1 to 3

val b = "a".to("z")

val c: Pair<String, String> = "a" to "z"

Page 74: Kotlin: A pragmatic language by JetBrains

Packagespackage foo.bar

fun baz() {}

class Goo {}

------------------------------------------

import foo.Bar // Bar is now accessible without qualification

import bar.Bar as bBar // bBar stands for 'bar.Bar'

import foo.* // everything in 'foo' becomes accessible