Fun with Kotlin

Preview:

Citation preview

Fun WithKotlin

by Egor Andreevici

INTRO

WHAT’S KOTLIN

INTRO

WHY KOTLIN?

INTRO

PRAGMATISM

Clarity Safety Interoperability Tooling

WHAT’S KOTLIN ABOUT?

INTRO

FOCUS ON USE CASESINTEROPERATE

WHY PRAGMATIC?

INTRO

WHO MAINTAINS KOTLIN?

INTRO

WHO’S USING KOTLIN?

SYNTAX

SYNTAX

fun sum(a: Int, b: Int): Int {  return a + b}

KOTLIN SYNTAX

SYNTAX

fun sum(a: Int, b: Int): Int {  return a + b}

KOTLIN SYNTAX

SYNTAX

fun sum(a: Int, b: Int): Int {  return a + b}

KOTLIN SYNTAX

SYNTAX

fun sum(a: Int, b: Int): Int {  return a + b}

KOTLIN SYNTAX

SYNTAX

fun sum(a: Int, b: Int): Int {  return a + b}

KOTLIN SYNTAX

SYNTAX

fun sum(a: Int, b: Int): Int {  return a + b}

KOTLIN SYNTAX

SYNTAX

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

KOTLIN SYNTAX

SYNTAX

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

KOTLIN SYNTAX

CLASSES

CLASSES

Kotlin Java

class Person public class Person {}

CREATING A CLASS

CLASSES

class Person

class Student : Person()

INHERITANCE

CLASSES

class Person

class Student : Person() // won’t compile!

INHERITANCE

CLASSES

class Person

class Student : Person() // won’t compile!

INHERITANCE

CLASSES

open class Person

class Student : Person() // voila!

INHERITANCE

CLASSES

open class Person(val name: String, var age: Int)

// Javapublic class Person { private final String name; private Integer age;

public Person(String name, Integer age) { // }

public String getName() { // } public Integer getAge() { // } public void setAge(Integer age) { // }}

CONSTRUCTORS

CLASSES

open class Person(val name: String, var age: Int)

Kotlin Java

val name: String final String name

var age: Int Integer age

VAL & VAR

CLASSES

data class Person(val name: String, var age: Int)

‣ equals() & hashCode() $0

‣ toString() $0

‣ componentN() functions $0

‣ copy() function $0

‣ TOTAL FREE!

DATA CLASSES

CLASSES

val name = person.component1()val age = person.component2()

COMPONENTN() FUNCTIONS

CLASSES

val name = person.component1()val age = person.component2()

for ((name, age) in people) { println("$name is $age years old")}

DESTRUCTURING DECLARATIONS

CLASSES

class Person { companion object { val FIELD_NAME = "name"

fun isOlderThan(person: Person, age: Int) = person.age > age }}

println(Person.isOlderThan(person, 30))

STATIC -> OBJECT

CLASSES

public final class StringUtils {

public static String capitalize(String str) { // TODO: return capitalized string return str; }}

StringUtils.capitalize(“a”);

UTILS IN JAVA

CLASSES

fun String.capitalize(): String { // TODO: return capitalized string return this}

"a".capitalize()

EXTENSIONS IN KOTLIN

CLASSES

fun String.capitalize(): String { // TODO: return capitalized string return this}

"a".capitalize()

import me.egorand.kotlin.extensions.capitalize

EXTENSIONS IN KOTLIN

NULL-SAFETY

NULL-SAFETY

THE BILLION DOLLAR MISTAKE

NULL SAFETY

var a: String = "abc"a = null // compilation error

var b: String? = "abc" b = null // OK

val l = a.length

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

NULLABLE VS NON-NULL TYPES

NULL SAFETY

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

CHECKING FOR NULL: SIMPLE APPROACH

NULL SAFETY

b?.length

bob?.department?.head?.name

CHECKING FOR NULL: SAFE CALLS

NULL SAFETY

CHECKING FOR NULL: ELVIS OPERATOR

NULL SAFETY

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

val l = b?.length ?: -1

CHECKING FOR NULL: ELVIS OPERATOR

NULL SAFETY

val l = b!!.length()

CHECKING FOR NULL: LIVING DANGEROUSLY

FUNCTIONS

FUNCTIONS

fun double(x: Int): Int { return x * 2}

val result = double(2)

FUNCTIONS IN KOTLIN

FUNCTIONS

fun Int.times(n: Int) = this * n

println(2.times(3))

INFIX NOTATION

FUNCTIONS

infix fun Int.times(n: Int) = this * n

println(2.times(3))

INFIX NOTATION

FUNCTIONS

infix fun Int.times(n: Int) = this * n

println(2 times 3)

INFIX NOTATION

FUNCTIONS

fun printString(str: String, prefix: String = "", postfix: String = "") { println(prefix + str + postfix)}

printString("hello")

printString("hello", "<")

printString("hello", "<", ">")

DEFAULT ARGUMENTS

FUNCTIONS

fun printString(str: String, prefix: String = "", postfix: String = "") { println(prefix + str + postfix)}

printString(“hello”, prefix = “<“, postfix = “>”)

NAMED ARGUMENTS

FUNCTIONS

fun <T> forEach(list: List<T>, f: (T) -> Unit) { for (elem in list) { f(elem) }}

val list = listOf("Alice", "Bob", "Claire")forEach(list, ::println)

forEach(list, { str -> println(str) })

HIGHER-ORDER FUNCTIONS

FUNCTIONS

fun <T> forEach(list: List<T>, f: (T) -> Unit) { for (elem in list) { f(elem) }}

val list = listOf("Alice", "Bob", "Claire")forEach(list, ::println)

forEach(list, { println(it) })

HIGHER-ORDER FUNCTIONS

FUNCTIONS

fun <T> forEach(list: List<T>, f: (T) -> Unit) { for (elem in list) { f(elem) }}

val list = listOf("Alice", "Bob", "Claire")forEach(list, ::println)

forEach(list) { println(it) }

HIGHER-ORDER FUNCTIONS

SMART CASTS

SMART CASTS

// Javaprivate static void demo(Object x) { if (x instanceof String) { String str = (String) x; System.out.println(str.length()); }}

CASTING IN JAVA

SMART CASTS

// Javaprivate static void demo(Object x) { if (x instanceof String) { String str = (String) x; System.out.println(str.length()); }}

// Kotlinfun demo(x: Any) { if (x is String) { println(x.length) }}

SMART CASTS IN KOTLIN

SMART CASTS

fun demo(x: Any) { if (x is String) { println(x.length) }}

IF EXPRESSION

SMART CASTS

fun demo(x: Any) { if (x !is String) { println("Not a String") } else { println(x.length) }}

IF-ELSE EXPRESSION

SMART CASTS

fun demo(x: Any) { if (x !is String) return println(x.length)}

RETURN STATEMENT

SMART CASTS

if (x !is String || x.length == 0) return

if (x is String && x.length > 0) print(x.length)

BOOLEAN EXPRESSIONS

WHAT’S NEXT?

WHAT’S NEXT?

POST-1.0 ROADMAP

▸ New language features

▸ Java 8/9 support

▸ JavaScript support

▸ Android tooling improvements

▸ IDE features

WHAT’S NEXT?

RESOURCES

▸ Kotlin - http://kotlinlang.org/

▸ Koans - http://try.kotlinlang.org/koans

▸ Blog - https://blog.jetbrains.com/kotlin/

▸ Forum - https://devnet.jetbrains.com/community/kotlin

▸ Slack - http://kotlinlang.slack.com/

Thank you!@EgorAnd

+EgorAndreevichhttp://blog.egorand.me/

Recommended