Fun with Kotlin
-
Upload
egor-andreevici -
Category
Software
-
view
134 -
download
2
Transcript of Fun with Kotlin
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/