Kotlin
(Who’s Yelling Now?)
@rorypreddy
• Shout “Vodka” and Raise your hand when you
see this Vodka Bottle:
• First one I see wins Vodka Shots
• Cant get seconds
Meet Rory
• Developer in R&D team at BBD
– Training for 500 Developers
– Most Languages & Frameworks
• Organizer for the Jozi-JUG
• Not related to Tyrion Lannister
• Don’t do kids parties
Meet Rory
Who’s Yelling Now?
• Kotlin devs yelling at everyone to use Kotlin
• Intellij users yelling at Eclipse users
• Swift devs yelling at everyone to use Swift
• Spring people yelling at Java EE people
What do we want?
• Concise
• Safe
• Interoperable
– I already have nice Java Toys
• Tooling
• All these for Microservices and Mobile!
What is Kotlin?
What is Kotlin?
• “Statically typed programming language targeting the
JVM and JavaScript”
• 100% interoperable with Java
• Made by JetBrains – Standard with IntelliJ
• Introduced in 2011 (well before Swift!!!)
• Code in Java 8 style for Android
• Loves Spring!
Who is using Kotlin?
Hello, World!
• kotlinc hello.kt -include-runtime -d hello.jar
• java -jar hello.jar
fun main(args: Array<String>) {
println("Hello, World!")
}
hello.kt
• Download compiler from github
- https://github.com/JetBrains/kotlin/releases/tag/v1.1
Installation Options
• Ant/Maven/Gradle
• Eclipse plugin
• Bundled with IntelliJ
• Online IDE – http://try.kotlinlang.org
• REPL / CMD Compiler/Scripts
http://try.kotlinlang.org
What features does Kotlin bring?
• Best of Java 8
• Lambdas (High Level Functions)
• Traits (interfaces with default implementation)
• Optional arguments (Null and Nil)
• Best of Scala
• Extension functions
• Pattern matching
• Type inference
• Tuples/Data objects (“Getters” and “Setters”)
• Simple singletons (object notation)
• C#
• Coroutines #NEW
16
Functional Kotlin
fun <T> forEachByRory(list: List<T>, f: (T) -> Unit) {
for (elem in list) {
f(elem)
}
}
val list = listOf("Alice", "Bob", "Claire")
forEachByRory(list, ::println)
forEachByRory(list, { str -> println(str) })
>Alice
Bob
Claire
Alice
Bob
Claire
18
Safe Kotlin
var a: String = "abc"
a = null // compilation error
var b: String? = "abc"
b = null // ok
if (b != null && b.length > 0)
print("String of length ${b.length}")
else
print("Empty string")
“Getters/Setters”
Kotlin
data class Country(val name: String? = null)
Java
public class Country {
private String name;
public Country(String name) {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
21
Type inference
Kotlin
val myMap = HashMap<String, List<String>>()
Java
Map<String, List<String>> myMap = new HashMap<String,
List<String>>();
// Or:
Map<String, List<String>> myMap2 = new HashMap<>();
23
Extension Functions
object Extension {
@JvmStatic fun main(argv: Array<String>) {
var s: String = "Hello world"
println( s.encodeSpaces())
}
}
fun String.encodeSpaces(): String {
return this.replace(" ", "_")
}
> Hello_world
24
Pattern Matching
val nb = 42
when (nb) {
in 0..7, 8, 9 ‐> println("single digit")
10 ‐> println("double digits")
in 11..99 ‐> println("double digits")
in 100..999 ‐> println("triple digits")
else ‐> println("four or more digits")
}
Who’s Yelling Now?
• Kotlin devs yelling at everyone to use Kotlin
• Intellij users yelling at Eclipse users
• Swift devs yelling at everyone to use Swift
• Spring people yelling at Java EE people
Who’s Yelling Now?
• Kotlin devs yelling at everyone to use Kotlin
• Intellij users yelling at Eclipse users
• Swift devs yelling at everyone to use Swift
• Spring people yelling at Java EE people
And in this corner - Donald Massyn
• Polyglot Developer for BBD
• Currently unpacking Angular 2
• The only person in the office who can code in
Assembler
Why Swift?
• Employs modern programming concepts
• Simplified syntax comparing to Objective-C
• Friendly syntax to Java, JavaScript and C#
Developers
• By default no pointers and unsafe accessors
• Retains key Objective-C concepts
• Can run together with C, C++ and Objective-C in
a single program
What features does Swift bring?
• It is a nice syntax which is easy to learn
• Strongly typed
• Functions are first-class objects
• Header files are not required anymore
• Exception handling
• Full support of Unicode in Strings
36
Swift vs Objective-C
Swift
hello = “Hello”
world = “World”
str = ”(hello) (world)!”
Obj-C
NSString *hello = @”Hello”;
NSString *world = @”World”;
NSString *str = [NSString stringWithFormat:@”%@ %@!”, hello,
world];
37
Swift vs Objective-C
Obj-C
for(int i = 0; i < 10; i++) {
if (i % 2 == 0) {
[array addObject:@i];
}
}
Swift
func isEven(Int) -> {
return number % 2 ==0
}
array = Array(1..10).filter(isEven)
Language Cheatsheet
Swift
nil
self
protocol
init
func
->
let
AnyObject
!
Kotlin
null
this
trait
constructor
fun
:
val
Any
!!
Kotlin Swift
Variables and Constants
var name: String = “Donald"
var address: String = “Jozi"
let MON: String = "Monday"
let TUE: String = "Tuesday"
let WED: String = "Wednesday"
let THU: String = "Thursday"
let FRI: String = "Friday"
var name: String = “Rory"
var address: String = “Jozi"
val MON: String = "Monday"
val TUE: String = "Tuesday"
val WED: String = "Wednesday"
val THU: String = "Thursday"
val FRI: String = "Friday"
Swift Kotlin
Functions and Methods
class FastFood {
func createBurger(item: String, id: Int) -> Burger
{
let ingredientFactory = KCIngredientFactory()
var burger = BeefBurger(factory:
ingredientFactory)
return burger
}
func createPizza(item: String, _ id: Int) ->
Burger {
let ingredientFactory = KCIngredientFactory()
var burger = BeefBurger(factory:
ingredientFactory)
return burger
}
fun createOrders() {
var burger = createBurger("beef", id: 101)
var pizza = createPizza("pepperoni", 101)
}
}
class FastFood {
fun createBurger(item: String, id: Int): Burger
{
val ingredientFactory = KCIngredientFactory()
var burger = BeefBurger(factory =
ingredientFactory)
return burger
}
fun createPizza(item: String, id: Int): Burger {
val ingredientFactory = KCIngredientFactory()
var burger = BeefBurger(factory =
ingredientFactory)
return burger
}
fun createOrders() {
var burger = createBurger("beef", id = 101)
var pizza = createPizza("pepperoni", 101)
}
}
Swift Kotlin
Classes and Instantiation
class Burger {
var id: Int
var name: String
init(id: Int, name: String) {
self.id = id
self.name = name
}
}
var burger = Burger(id: 101,
name:"KC Burger")
class Burger {
var id: Int
var name: String
constructor(id: Int, name:
String) {
this.id = id
this.name = name
}
}
var burger = Burger(id=101,
name="KC Burger")
Kotlin Swift
Classes and Inheritance
class Burger {
var id: Int
var name: String
init(id: Int, name: String) {
self.id = id
self.name = name
}
}
class BeefBurger : Burger {
override init(id: Int, name: String) {
super.init(id: id, name: name)
}
}
var burger = BeefBurger(id: 101, name:"KC Burger")
open class Burger {
var id: Int
var name: String
constructor(id: Int, name: String) {
this.id = id
this.name = name
}
}
class BeefBurger: Burger {
constructor(id: Int, name: String):
super(id, name){
}
}
var burger = BeefBurger(id=101, name="KC Burger")
Swift Kotlin
Protocols and Traits
protocol IngredientFactory {
func createBeef() -> Beef
func createChicken() -> Chicken
func createFish() -> Fish
func createCheese() -> Cheese
func createToppings() -> Array <Topping>
func createSauces() -> Array <Sauce>
}
trait IngredientFactory {
fun createBeef(): Beef
fun createChicken(): Chicken
fun createFish(): Fish
fun createCheese(): Cheese
fun createToppings():ArrayList <Topping>
fun createSauces():ArrayList <Sauce>
}
class KCIngredientFactory: IngredientFactory {
func createBeef() -> Beef {
return CorkBeef()
}
func createChicken() -> Chicken {
return ChickenBreast()
}
func createFish() -> Fish {
return BatteredFish()
}
func createCheese() -> Cheese {
return Cheese.MatureCheddar
}
func createToppings() -> Array<Topping> {
var toppings = Array<Topping>()
toppings.add(Topping.Onions)
return toppings
}
func createSauces() -> Array<Sauce> {
var sauces = Array<Sauce>()
sauces.add(Sauce.Mayo)
sauces.add(Sauce.Ketchup)
return sauces
}
class KCIngredientFactory: IngredientFactory {
override fun createBeef(): Beef {
return CorkBeef()
}
override fun createChicken(): Chicken {
return ChickenBreast()
}
override fun createFish(): Fish {
return BatteredFish()
}
override fun createCheese(): Cheese {
return Cheese.MatureCheddar
}
override fun createToppings():
ArrayList<Topping> {
var toppings = ArrayList<Topping>()
toppings.add(Topping.Onions)
return toppings
}
fun createSauces(): Array<Sauce> {
var sauces = ArrayList<Sauce>()
sauces.add(Sauce.Mayo)
sauces.add(Sauce.Ketchup)
return sauces
}
Kotlin Swift
Protocols and Traits
Swift Kotlin
Enums
enum class Cheese {
MatureCheddar
MeltyCheese
}
enum class Topping {
IcebergLettuce
Gherkins
Pickles Onions
}
enum class Sauce {
Mayo
Ketchup
Mustard
}
enum Cheese {
case MatureCheddar
case MeltyCheese
}
enum Topping {
case IcebergLettuce
case Gherkins
case Pickles
case Onions
}
enum Sauce {
case Mayo
case Ketchup
case Mustard
}
var a: String = “abc”
a = null // compilation error
var b: String? = “abc”
b = null // ok
class KCBurgerStand: BurgerStand {
val factory = KCIngredientFactory()
fun createBurger(item: String): Burger {
var burger: Burger? = null
if (item == "beef") {
burger = BeefBurger(factory: factory)
burger!!.name = "KC Special Burger"
} else if (item == "chicken") {
burger = ChickenBurger(factory: factory)
burger!!.name = "KC Creole In A Bun"
} else if (item == "fish") {
burger = FishBurger(factory: factory)
burger!!.name = "KC Atlantis Fish Burger"
}
return burger!!
}
}
SwiftKotlin
Nil and Null Safety
var a: String = “abc”
a = nil // compilation error
var b: String? = “abc”
b = nil // ok
class KCBurgerStand: BurgerStand {
let factory = KCIngredientFactory()
func createBurger(item: String) -> Burger {
var burger: Burger?
if (item == "beef") {
burger = BeefBurger(factory: factory)
burger!.name = "KC Special Burger"
} else if (item == "chicken") {
burger = ChickenBurger(factory: factory)
burger!.name = "KC Breast In A Bun"
} else if (item == "fish") {
burger = FishBurger(factory: factory)
burger!.name = "KC Atlantis Fish Burger"
}
return burger!
}
}
Swift Kotlin
Type Checks and Casts
for current in someObjects {
if let movie = current as? Movie {
print("Movie: '(movie.name)', " +
"dir. (movie.director)")
}
}
for (current in someObjects) {
if (current is Movie) {
println("Movie: '${current.name}', “ +
"dir. ${current.director}")
}
}
Kotlin Swift
Extensions
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("One inch is (oneInch) meters")
// prints "One inch is 0.0254 meters“
let threeFeet = 3.ft
print("Three feet is (threeFeet) meters")
// prints "Three feet is 0.914399970739201
meters"
val Double.km: Double get() = this * 1000
val Double.m: Double get() = this
val Double.cm: Double get() = this / 100
val Double.mm: Double get() = this / 1000
val Double.ft: Double get() = this / 3.28084
val oneInch = 25.4.mm
println("One inch is $oneInch meters")
// prints "One inch is 0.0254 meters“
val threeFeet = 3.0.ft
println("Three feet is $threeFeet meters")
// prints "Three feet is 0.914399970739201
meters"
Other Language Features
Feature Swift Kotlin
Class Import NO YES
Packages NO OPTIONAL
Exceptions YES YES
Visibility Modifiers YES YES
Primary Constructors NO YES
Annotations NO YES
Tuples YES YES
Property Observers YES NO
Operator Overloading YES YES
Type Safe Builders NO YES
Returns and Jumps NO YES
App Architecture
Model and Business Service Layers
Application Application
Activities
Fragments
ViewControllers
Services
Model and Business Service Layers
Android StudioAppCode
Who’s Yelling Now?
• Kotlin devs yelling at everyone to use Kotlin
• Intellij users yelling at Eclipse users
• Swift devs yelling at everyone to use Swift
• Spring people yelling at Java EE people
@rorypreddy

Kotlin

  • 1.
  • 2.
    • Shout “Vodka”and Raise your hand when you see this Vodka Bottle: • First one I see wins Vodka Shots • Cant get seconds
  • 3.
    Meet Rory • Developerin R&D team at BBD – Training for 500 Developers – Most Languages & Frameworks • Organizer for the Jozi-JUG • Not related to Tyrion Lannister • Don’t do kids parties Meet Rory
  • 5.
    Who’s Yelling Now? •Kotlin devs yelling at everyone to use Kotlin • Intellij users yelling at Eclipse users • Swift devs yelling at everyone to use Swift • Spring people yelling at Java EE people
  • 6.
    What do wewant? • Concise • Safe • Interoperable – I already have nice Java Toys • Tooling • All these for Microservices and Mobile!
  • 8.
  • 9.
    What is Kotlin? •“Statically typed programming language targeting the JVM and JavaScript” • 100% interoperable with Java • Made by JetBrains – Standard with IntelliJ • Introduced in 2011 (well before Swift!!!) • Code in Java 8 style for Android • Loves Spring!
  • 10.
    Who is usingKotlin?
  • 11.
    Hello, World! • kotlinchello.kt -include-runtime -d hello.jar • java -jar hello.jar fun main(args: Array<String>) { println("Hello, World!") } hello.kt • Download compiler from github - https://github.com/JetBrains/kotlin/releases/tag/v1.1
  • 12.
    Installation Options • Ant/Maven/Gradle •Eclipse plugin • Bundled with IntelliJ • Online IDE – http://try.kotlinlang.org • REPL / CMD Compiler/Scripts
  • 13.
  • 14.
    What features doesKotlin bring? • Best of Java 8 • Lambdas (High Level Functions) • Traits (interfaces with default implementation) • Optional arguments (Null and Nil) • Best of Scala • Extension functions • Pattern matching • Type inference • Tuples/Data objects (“Getters” and “Setters”) • Simple singletons (object notation) • C# • Coroutines #NEW
  • 16.
    16 Functional Kotlin fun <T>forEachByRory(list: List<T>, f: (T) -> Unit) { for (elem in list) { f(elem) } } val list = listOf("Alice", "Bob", "Claire") forEachByRory(list, ::println) forEachByRory(list, { str -> println(str) }) >Alice Bob Claire Alice Bob Claire
  • 18.
    18 Safe Kotlin var a:String = "abc" a = null // compilation error var b: String? = "abc" b = null // ok if (b != null && b.length > 0) print("String of length ${b.length}") else print("Empty string")
  • 20.
    “Getters/Setters” Kotlin data class Country(valname: String? = null) Java public class Country { private String name; public Country(String name) { } public String getName() { return name; } public void setName(String name) { this.name = name; } }
  • 21.
    21 Type inference Kotlin val myMap= HashMap<String, List<String>>() Java Map<String, List<String>> myMap = new HashMap<String, List<String>>(); // Or: Map<String, List<String>> myMap2 = new HashMap<>();
  • 23.
    23 Extension Functions object Extension{ @JvmStatic fun main(argv: Array<String>) { var s: String = "Hello world" println( s.encodeSpaces()) } } fun String.encodeSpaces(): String { return this.replace(" ", "_") } > Hello_world
  • 24.
    24 Pattern Matching val nb= 42 when (nb) { in 0..7, 8, 9 ‐> println("single digit") 10 ‐> println("double digits") in 11..99 ‐> println("double digits") in 100..999 ‐> println("triple digits") else ‐> println("four or more digits") }
  • 25.
    Who’s Yelling Now? •Kotlin devs yelling at everyone to use Kotlin • Intellij users yelling at Eclipse users • Swift devs yelling at everyone to use Swift • Spring people yelling at Java EE people
  • 31.
    Who’s Yelling Now? •Kotlin devs yelling at everyone to use Kotlin • Intellij users yelling at Eclipse users • Swift devs yelling at everyone to use Swift • Spring people yelling at Java EE people
  • 33.
    And in thiscorner - Donald Massyn • Polyglot Developer for BBD • Currently unpacking Angular 2 • The only person in the office who can code in Assembler
  • 34.
    Why Swift? • Employsmodern programming concepts • Simplified syntax comparing to Objective-C • Friendly syntax to Java, JavaScript and C# Developers • By default no pointers and unsafe accessors • Retains key Objective-C concepts • Can run together with C, C++ and Objective-C in a single program
  • 35.
    What features doesSwift bring? • It is a nice syntax which is easy to learn • Strongly typed • Functions are first-class objects • Header files are not required anymore • Exception handling • Full support of Unicode in Strings
  • 36.
    36 Swift vs Objective-C Swift hello= “Hello” world = “World” str = ”(hello) (world)!” Obj-C NSString *hello = @”Hello”; NSString *world = @”World”; NSString *str = [NSString stringWithFormat:@”%@ %@!”, hello, world];
  • 37.
    37 Swift vs Objective-C Obj-C for(inti = 0; i < 10; i++) { if (i % 2 == 0) { [array addObject:@i]; } } Swift func isEven(Int) -> { return number % 2 ==0 } array = Array(1..10).filter(isEven)
  • 38.
  • 39.
    Kotlin Swift Variables andConstants var name: String = “Donald" var address: String = “Jozi" let MON: String = "Monday" let TUE: String = "Tuesday" let WED: String = "Wednesday" let THU: String = "Thursday" let FRI: String = "Friday" var name: String = “Rory" var address: String = “Jozi" val MON: String = "Monday" val TUE: String = "Tuesday" val WED: String = "Wednesday" val THU: String = "Thursday" val FRI: String = "Friday"
  • 40.
    Swift Kotlin Functions andMethods class FastFood { func createBurger(item: String, id: Int) -> Burger { let ingredientFactory = KCIngredientFactory() var burger = BeefBurger(factory: ingredientFactory) return burger } func createPizza(item: String, _ id: Int) -> Burger { let ingredientFactory = KCIngredientFactory() var burger = BeefBurger(factory: ingredientFactory) return burger } fun createOrders() { var burger = createBurger("beef", id: 101) var pizza = createPizza("pepperoni", 101) } } class FastFood { fun createBurger(item: String, id: Int): Burger { val ingredientFactory = KCIngredientFactory() var burger = BeefBurger(factory = ingredientFactory) return burger } fun createPizza(item: String, id: Int): Burger { val ingredientFactory = KCIngredientFactory() var burger = BeefBurger(factory = ingredientFactory) return burger } fun createOrders() { var burger = createBurger("beef", id = 101) var pizza = createPizza("pepperoni", 101) } }
  • 41.
    Swift Kotlin Classes andInstantiation class Burger { var id: Int var name: String init(id: Int, name: String) { self.id = id self.name = name } } var burger = Burger(id: 101, name:"KC Burger") class Burger { var id: Int var name: String constructor(id: Int, name: String) { this.id = id this.name = name } } var burger = Burger(id=101, name="KC Burger")
  • 42.
    Kotlin Swift Classes andInheritance class Burger { var id: Int var name: String init(id: Int, name: String) { self.id = id self.name = name } } class BeefBurger : Burger { override init(id: Int, name: String) { super.init(id: id, name: name) } } var burger = BeefBurger(id: 101, name:"KC Burger") open class Burger { var id: Int var name: String constructor(id: Int, name: String) { this.id = id this.name = name } } class BeefBurger: Burger { constructor(id: Int, name: String): super(id, name){ } } var burger = BeefBurger(id=101, name="KC Burger")
  • 43.
    Swift Kotlin Protocols andTraits protocol IngredientFactory { func createBeef() -> Beef func createChicken() -> Chicken func createFish() -> Fish func createCheese() -> Cheese func createToppings() -> Array <Topping> func createSauces() -> Array <Sauce> } trait IngredientFactory { fun createBeef(): Beef fun createChicken(): Chicken fun createFish(): Fish fun createCheese(): Cheese fun createToppings():ArrayList <Topping> fun createSauces():ArrayList <Sauce> }
  • 44.
    class KCIngredientFactory: IngredientFactory{ func createBeef() -> Beef { return CorkBeef() } func createChicken() -> Chicken { return ChickenBreast() } func createFish() -> Fish { return BatteredFish() } func createCheese() -> Cheese { return Cheese.MatureCheddar } func createToppings() -> Array<Topping> { var toppings = Array<Topping>() toppings.add(Topping.Onions) return toppings } func createSauces() -> Array<Sauce> { var sauces = Array<Sauce>() sauces.add(Sauce.Mayo) sauces.add(Sauce.Ketchup) return sauces } class KCIngredientFactory: IngredientFactory { override fun createBeef(): Beef { return CorkBeef() } override fun createChicken(): Chicken { return ChickenBreast() } override fun createFish(): Fish { return BatteredFish() } override fun createCheese(): Cheese { return Cheese.MatureCheddar } override fun createToppings(): ArrayList<Topping> { var toppings = ArrayList<Topping>() toppings.add(Topping.Onions) return toppings } fun createSauces(): Array<Sauce> { var sauces = ArrayList<Sauce>() sauces.add(Sauce.Mayo) sauces.add(Sauce.Ketchup) return sauces } Kotlin Swift Protocols and Traits
  • 45.
    Swift Kotlin Enums enum classCheese { MatureCheddar MeltyCheese } enum class Topping { IcebergLettuce Gherkins Pickles Onions } enum class Sauce { Mayo Ketchup Mustard } enum Cheese { case MatureCheddar case MeltyCheese } enum Topping { case IcebergLettuce case Gherkins case Pickles case Onions } enum Sauce { case Mayo case Ketchup case Mustard }
  • 47.
    var a: String= “abc” a = null // compilation error var b: String? = “abc” b = null // ok class KCBurgerStand: BurgerStand { val factory = KCIngredientFactory() fun createBurger(item: String): Burger { var burger: Burger? = null if (item == "beef") { burger = BeefBurger(factory: factory) burger!!.name = "KC Special Burger" } else if (item == "chicken") { burger = ChickenBurger(factory: factory) burger!!.name = "KC Creole In A Bun" } else if (item == "fish") { burger = FishBurger(factory: factory) burger!!.name = "KC Atlantis Fish Burger" } return burger!! } } SwiftKotlin Nil and Null Safety var a: String = “abc” a = nil // compilation error var b: String? = “abc” b = nil // ok class KCBurgerStand: BurgerStand { let factory = KCIngredientFactory() func createBurger(item: String) -> Burger { var burger: Burger? if (item == "beef") { burger = BeefBurger(factory: factory) burger!.name = "KC Special Burger" } else if (item == "chicken") { burger = ChickenBurger(factory: factory) burger!.name = "KC Breast In A Bun" } else if (item == "fish") { burger = FishBurger(factory: factory) burger!.name = "KC Atlantis Fish Burger" } return burger! } }
  • 48.
    Swift Kotlin Type Checksand Casts for current in someObjects { if let movie = current as? Movie { print("Movie: '(movie.name)', " + "dir. (movie.director)") } } for (current in someObjects) { if (current is Movie) { println("Movie: '${current.name}', “ + "dir. ${current.director}") } }
  • 49.
    Kotlin Swift Extensions extension Double{ var km: Double { return self * 1_000.0 } var m: Double { return self } var cm: Double { return self / 100.0 } var mm: Double { return self / 1_000.0 } var ft: Double { return self / 3.28084 } } let oneInch = 25.4.mm print("One inch is (oneInch) meters") // prints "One inch is 0.0254 meters“ let threeFeet = 3.ft print("Three feet is (threeFeet) meters") // prints "Three feet is 0.914399970739201 meters" val Double.km: Double get() = this * 1000 val Double.m: Double get() = this val Double.cm: Double get() = this / 100 val Double.mm: Double get() = this / 1000 val Double.ft: Double get() = this / 3.28084 val oneInch = 25.4.mm println("One inch is $oneInch meters") // prints "One inch is 0.0254 meters“ val threeFeet = 3.0.ft println("Three feet is $threeFeet meters") // prints "Three feet is 0.914399970739201 meters"
  • 50.
    Other Language Features FeatureSwift Kotlin Class Import NO YES Packages NO OPTIONAL Exceptions YES YES Visibility Modifiers YES YES Primary Constructors NO YES Annotations NO YES Tuples YES YES Property Observers YES NO Operator Overloading YES YES Type Safe Builders NO YES Returns and Jumps NO YES
  • 51.
    App Architecture Model andBusiness Service Layers Application Application Activities Fragments ViewControllers Services Model and Business Service Layers
  • 52.
  • 53.
    Who’s Yelling Now? •Kotlin devs yelling at everyone to use Kotlin • Intellij users yelling at Eclipse users • Swift devs yelling at everyone to use Swift • Spring people yelling at Java EE people
  • 56.