Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A case of Kotl.in

Avatar for Rachit Rachit
June 15, 2017

A case of Kotl.in

A presentation about basics of Kotlin, inspired by sessions from Jake Wharton and Rusell Winders

Avatar for Rachit

Rachit

June 15, 2017

More Decks by Rachit

Other Decks in Programming

Transcript

  1. Intro Statically typed language by Jetbrains since 2011 V1 around

    2016 Interoperable Concise Statically typed language by Jetbrains since 2011
  2. Intro Statically typed language by Jetbrains since 2011 V1 around

    2016 Interoperable Concise V1 around 2016
  3. Intro Statically typed language by Jetbrains since 2011 V1 around

    2016 V1 around 2016 Interoperable Concise Interoperable
  4. Why Kotlin Java is slow in evolution Java is not

    to so great on Android A lot of Util classes Null Pointer Exceptions
  5. Why Kotlin Java is slow in evolution Java is not

    to so great on Android A lot of Util classes Null Pointer Exceptions
  6. Why Kotlin Java is slow in evolution Java is not

    to so great on Android A lot of Util classes Null Pointer Exceptions
  7. Why Kotlin Java is slow in evolution Java is not

    to so great on Android Lots of Util classes Null Pointer Exceptions
  8. Hello world fun main(args: Array<String>) { val myName = "World"

    println("Hello $myName"} println("I am ${myName.length + 8} years old"} }
  9. Hello world fun main(args: Array<String>) { val myName = "World"

    println("Hello $myName"} println("I am ${myName.length + 8} years old"} } fun main(args: Array<String>) { val myName = "World" println("Hello $myName"} println("I am ${myName.length + 8} years old"} } $myName ${myName.length + 8}
  10. Immutability, Type Inference var myVar : String = "SomeAwesomeValue" val

    myVal : String = "SomeAwesomeValue" var myVar : String = "SomeAwesomeValue"
  11. Immutability var myVar = 123 var myVar : String =

    "SomeAwesomeValue" val myVal = "Raju" Immutability, Type Inference Immutability, var myVar : String = "SomeAwesomeValue"
  12. Expressions String x = null if (myAwesomeValue != null) {

    x = “myAwesomeValue” } else { x = “somethingElse” } var x = if (myAwesomeValue != null) { "myAwesomeValue" } else { "somethingElse" }
  13. String x = null if (myAwesomeValue != null) { x

    = “myAwesomeValue” } else { x = “somethingElse” } String x = null if (myAwesomeValue != null) { x = “myAwesomeValue” } else { x = “somethingElse” } Expressions var x = if (myAwesomeValue != null) { "myAwesomeValue" } else { "somethingElse" }
  14. String myString = null switch(someCase) { case 1: myString =

    "NewString"; break; case 2: myString = "SomeOtherString"; } Expressions var x = when (myVar) { !is X -> doSomething() “AwesomeValue” -> { reallyDoSomething() } else -> “FTW” } String myString = null switch(someCase) { case 1: myString = "NewString"; break; case 2: myString = "SomeOtherString"; }
  15. String myString = null switch(someCase) { case 1: myString =

    "NewString"; break; case 2: myString = "SomeOtherString"; } Expressions var x = when (myVar) { !is X -> doSomething() “AwesomeValue” -> { reallyDoSomething() } else -> “FTW” } String myString = null switch(someCase) { case 1: myString = "NewString"; break; case 2: myString = "SomeOtherString"; } var x = when (myVar) { !is X -> doSomething() “AwesomeValue” -> { reallyDoSomething() } else -> “FTW” } String myString = null switch(someCase) { case 1: myString = "NewString"; break; case 2: myString = "SomeOtherString"; }
  16. Fun: extension, high order, lambda fun String.toSnackCase() : String {

    return this.split(" ").joinToString("_") } "The King".toSnackCase() // outputs The_King fun Activity.isAlive() = !this..isFinishing()
  17. Fun: extension, high order, lambda //a high order function with

    lambda/function receiver fun unaryOp(num1: Int = 2, op: (Int) -> Int) { println(op(num1)) } unaryOp(2) { it*it ) unaryOp(2, {x -> x*2})
  18. Fun: extension, high order, lambda //a high order function with

    lambda/function receiver fun unaryOp(num1: Int = 2, op: (Int) -> Int) { println(op(num1)) } Int = 2 unaryOp(2) { it*it ) unaryOp(2, {x -> x*2}) //a high order function with lambda/function receiver fun unaryOp(num1: Int = 2, op: (Int) -> Int) { println(op(num1)) }
  19. Fun: extension, high order, lambda //a high order function with

    lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } //a high order function with lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } op: (Int) -> Int unaryOp(2) { it*it ) unaryOp(2, {x -> x*2})
  20. Fun: extension, high order, lambda //a high order function with

    lambda fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } //a high order function with lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } unaryOp(2, {x -> x*2}) unaryOp(2) { it*it ) unaryOp(2, {x -> x*2})
  21. Fun: extension, high order, lambda //a high order function with

    lambda fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } //a high order function with lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } unaryOp(2, {x -> x*2}) unaryOp(2) { it*it ) unaryOp(2, {x -> x*2}) unaryOp(2, {x -> x*2}) {x -> x*2} unaryOp(2, {x -> x*2}) fun sum(num: Int) { return num*num } unaryOp(2, ::sum)
  22. Fun: extension, high order, lambda //a high order function with

    lambda fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } //a high order function with lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } unaryOp(2, {x -> x*2}) unaryOp(2) { it*it } unaryOp(2, {x -> x*2}) unaryOp(2, {x -> x*2}) {x -> x*2} unaryOp(2, {x -> x*2}) fun sum(num: Int) { return num*num } unaryOp(2, ::sum)
  23. Fun: extension, high order, lambda //a high order function with

    lambda fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } //a high order function with lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } unaryOp(2, {x -> x*2}) unaryOp(2) { it*it ) unaryOp(2, {x -> x*2}) unaryOp(2, {x -> x*2}) {x -> x*2} unaryOp(2, {x -> x*2}) fun sum(num: Int) { return num*num } unaryOp(2, ::sum)
  24. Fun: extension, high order, lambda //a high order function with

    lambda fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } //a high order function with lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } unaryOp(2, {x -> x*2}) unaryOp(2) { it*it ) unaryOp(2, {x -> x*2}) unaryOp(2, {x -> x*2}) {x -> x*2} unaryOp(2, {x -> x*2}) fun sum(num: Int) { return num*num } unaryOp(2, ::sum)
  25. Fun: extension, high order, lambda //a high order function with

    lambda fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } //a high order function with lambda/function receiver fun unaryOp(num1: Int, op: (Int) -> Int) { println(op(num1)) } unaryOp(2, {x -> x*2}) unaryOp(2) { it*it ) unaryOp(2, {x -> x*2}) unaryOp(2, {x -> x*2}) {x -> x*2} unaryOp(2, {x -> x*2}) fun sum(num: Int) { return num*num } unaryOp(2, ::sum) ::sum unaryOp(2, ::sum)
  26. Nullability & Type Safety if(someObject != null) { if(someObject.someChild !=

    null) { println(someChild.someValue) } } var myObject : String? mObject.someValue // this won't compile mObject?.someValue // this will compile mObject?.myChildObject?.someValue // this will compile mObject!!.someValue // this will compile if(someObject != null) { if(someObject.someChild != null) { println(someChild.someValue) } }
  27. Nullability & Type Safety myVar = myNewVar as? String var

    myVar: String = "Hello" val myNewVar: Int = 1 myVar = myNewVar as String // what will happen?
  28. Nullability & Type Safety myVar = myNewVar as? String val

    myVar: String = "Hello" val myNewVar: Int = 1 myVar = myNewVar as String // what will happen? val myVar: String = "Hello" val myNewVar: Int = 1 myVar = myNewVar as String // what will happen?
  29. Class, object, interface, data class class Person class Person() {

    } class Person(val name : String = "SomeDefaultValue") { init { name = name.toSnackCase() } } open class Person() { } val Person = Person()
  30. Class, object, interface, data class class Person class Person() {

    } class Person(val name : String = "SomeDefaultValue") { init { name = name.toSnackCase() } } open class Person() { } val Person = Person() class Person class Person() { } class Person(val name : String = "SomeDefaultValue") { init { name = name.toSnackCase() } } open class Person() { } val Person = Person() class Person(val name : String = "SomeDefaultValue") { init { name = name.toSnackCase() } }
  31. Class, object, interface, data class class Person class Person() {

    } class Person(val name : String = "SomeDefaultValue") { init { name = name.toSnackCase() } } open class Person() { } class Person class Person() { } class Person(val name : String = "SomeDefaultValue") { init { name = name.toSnackCase() } } open class Person() { } val Person = Person()
  32. Class, object, interface, data class class Person class Person() {

    } class Person(val name : String = "SomeDefaultValue") { init { name = name.toSnackCase() } } open class Person() { } val Person = Person()
  33. Class, object, interface, data class // object class object MyObject

    { var myVar: String = "Some constant" fun myObjectFunction() { } } // interface with method interface MyInterface { fun myInterfaceFunction() { } }
  34. Class, objec, interface, data class // object class object MyObject

    { var myVar: String = "Some constant" fun myObjectFunction() { } } // interface with method interface MyInterface { fun myInterfaceFunction() { } } // object class object MyObject { var myVar: String = "Some constant" fun myObjectFunction() { } }
  35. Class, interface, object class, data class // data class data

    class Person(var name: String = “Nishant Shah”, var age: Int) class Person { private String mName; private int mAge; getName() getAge() setName() setAge() equals() hashCode() } class Person { private String mName; private int mAge; getName() getAge() setName() setAge() equals() hashCode() }
  36. Class, interface, object class, data class // data class data

    class Person(var name: String = “Nishant Shah”, var age: Int) class Person { private String mName; private int mAge; getName() getAge() setName() setAge() equals() hashCode() } class Person { private String mName; private int mAge; getName() getAge() setName() setAge() equals() hashCode() }
  37. Caveats Lambda function inline keyword inline fun unaryOp(num1: Int, op:

    (Int) -> Int) { println(op(num1)) } inline keyword
  38. Caveats Nullabillity fun add(a: Int?, b: Int?): Int { return

    (a ?: 0) + (b ?: 0) } Burden of boxing and unboxing variables