Почему Android разработчики переходят на Kotlin

Почему Android разработчики переходят на Kotlin

Рассказал почему Android разработчики за последний год активно переходят на язык программирования Kotlin с Java. В чем прелесть этого языка и как выглядели бы код на Java в Kotlin.

D149cf7c52e490482063845a74c43263?s=128

Janibek Marshal

August 23, 2018
Tweet

Transcript

  1. Почему Android разработчики переходят на Kotlin DrinkUp Almaty, 23 Авг.

    2018 Маршал Жанибек Ведущий разработчик Android в kolesa krisha market
  2. Состояние Java на Android • Java bytecode приложения запускаются на

    Dalvik Virtual Machine либо на Android Runtime
  3. Состояние Java на Android • Java bytecode приложения запускаются на

    Dalvik Virtual Machine либо на Android Runtime • Разработчикам доступно JDK 7 по умолчанию
  4. Состояние Java на Android • Java bytecode приложения запускаются на

    Dalvik Virtual Machine либо на Android Runtime • Разработчикам доступно JDK 7 по умолчанию • Можно подключить plugin для базовой поддержки JDK 8
  5. Состояние Java на Android • Java bytecode приложения запускаются на

    Dalvik Virtual Machine либо на Android Runtime • Разработчикам доступно JDK 7 по умолчанию • Можно подключить plugin для базовой поддержки JDK 8 • Google поругался с Oracle по правообладанию
  6. Что такое Kotlin

  7. Разработан от JetBrains (IntelliJ) Open source с 2011 г. 100%

    интерполирован с Java Официально поддержка на Android с 2017 г. Простой и надежный язык со множеством фич Что такое Kotlin
  8. Lambda expressions Inline functions Extension functions Null Safety Smart cast

    String templates Properties Primary constructor First-class delegation Type inference for variable and property types Singletons Declaration-site variance Type projections Range expressions Operator overloading Companion objects Data classes Separate interfaces for read-only and mutable collections Coroutines Что есть у Kotlin, но нет у Java
  9. Kotlin решает многие проблемы Java NullPointerException Boilerplate Mutable или Immutable

    Версия языка и т.д.
  10. Знакомый синтаксис Начать писать на Kotlin можно сразу

  11. Kotlin syntax class DrinkUp { val barName: String = "Lenore

    Pub" var beers = 0 fun drink() { print(“I have drinked ${beers++} at $dringUpBar”) } }
  12. В JDK 8 есть Lambda У Kotlin тоже но элегантнее

  13. Java Lambdas interface MathOperation { int operation(int x, int y);

    } MathOperation add = (x, y) -> x + y; int total = add.operation(2, 3); Kotlin Lambdas val add = { x: Int, y: Int -> x + y } val total = add(2, 3)
  14. Головная боль тех кто пишет Java код NullPointerException

  15. https://stackoverflow.com/questions/271526/avoiding-null-statements

  16. Null Safety val foo: String = null // Не скомпилируется

    val bar: String? = null print(bar?.length) // Выведет текст “null”
  17. Еще меньше проверок Smart Cast when (x) { is Int

    -> print(x + 1) // ((Int) x) + 1 is String -> print(x.length + 1) // ((String) x).length + 1 is IntArray -> print(x.sum()) // ((IntArray) x).sum() }
  18. Getter, Setter, toString, equals на Java public class DrinkUpMeetup {

    private final long mId; private final Date mStartTime; private int mBeers; public DrinkUpMeetup(...) { mId = id; ... } public long getId() { return mId; } public void setBeers(int beers) { mBeers = beers; } ... @Override public void toString() { … } @Override public boolean equals() { … } @Override public int hashCode() { … } } Г*вно(#`Д´)ノノ┻┻;:'、・゙
  19. Getter, Setter, toString, equals data class data class DrinkUpMeetup( val

    id: Long, val startTime: Date, var beers: Int, )
  20. Читабельнее Значение по-умолчанию data class DrinkUpMeetup( val place: String =

    “Almaty”, val speekers: List<String> ) val drinkUp = DrinkUp( “Almaty, Lenore Pub”, listOf(“Anton”, “Janibek”, “Qwazaar”) )
  21. Читабельнее Именуемые аргументы data class DrinkUpMeetup( val place: String =

    “Almaty”, val speekers: List<String> ) val drinkUp = DrinkUp( place = “Almaty, Lenore Pub”, speekers = listOf(“Anton”, “Janibek”, “Qwazaar”) )
  22. Еще удобнее Перегрузка (Overloading) операторов data class Vector(val x: Float,

    val y: Float) { operator fun plus(v: Vector) = Vector(x + v.x, y + v.y) } val v = Vector(x = 2f, y = 3f) + Vector(x = 4f, y = 1f)
  23. Extensions Расширяет класс с новой функциональностью, не наследуя от класса

    и без необходимости написать Decorator class DrinkUpAlmaty { … } fun DrinkUpAlmaty.drink(whiskey: Whiskey) { print(“I love $whiskey more than beer”) }
  24. Самый главный аргумент Старый код в проекте можно не трогать

  25. None
  26. val number: Int = 10 В runtime приведет к примитивному

    типу Чего нет у Kotlin Primitive type
  27. Чего нет у Kotlin - Static members kz/kolesa/utils/AppUtils.java kz/kolesa/utils/AppUtils.kt

  28. Чего нет у Kotlin ternary operator String message = drinkUpMember.isDrinking()

    ? “Будьмо!” : “ЗОЖ” val message = if (drinkUpMember.isDrinking()) “Будьмо!” else “ЗОЖ”
  29. Чего нет у Kotlin ternary operator String message = drinkUpMember.isDrinking()

    ? “Будьмо!” : “ЗОЖ” val message = if (drinkUpMember.isDrinking()) “Будьмо!” else “ЗОЖ”
  30. Android Studio работает на базе IntelliJ IDEA Прямая поддержка от

    создателей Kotlin
  31. Cmd + Alt + Shift + K(otlin) Java class Kotlin

    class
  32. И еще одно “Coroutines”

  33. Kotlin Coroutines experimental • Решает работу с асинхронными задачами •

    Переходы между UI и Background потоками • Suspend ◦ Означает что вызов метода будет блокироваться • Launch ◦ Переходы на соответствующий context потока • Async { do long task }.await()
  34. Kotlin Coroutine suspend fun getBeer() = barman.requestBeer() fun drinkBeer( speaker:

    Speaker = Speaker(“Janibek”) ) = launch(presentationTask) { val beer = async(orderTask) { getBeer() }.await() speaker.drink(beer) }
  35. Но в некоторых аспектах Java круче (шутка)

  36. Материалы • kotlinlang.org/.../comparison-to-java.html • medium.com/@magnus.chatt/why-you-should-tot ally-switch-to-kotlin

  37. Можно дальше пить и холиварить Email: janibek.marshal[at]gmail.com Twitter: @megasuperhero Telegram:

    @orangerange