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

01 Kotlin Programming Language. What it is all ...

01 Kotlin Programming Language. What it is all about. Roman Belov, PMM in Kotlin

JetBrainsRU

May 17, 2018
Tweet

More Decks by JetBrainsRU

Other Decks in Programming

Transcript

  1. “We’ve built tools to support so many nice languages, and

    we’re still using Java” JetBrains, 2010
  2. • Kotlin is a modern language for JVM, JS and

    Native • Statically-typed • Object-oriented and functional paradigms • Open source under Apache 2.0 • Ver 1.0 in 2016 • Compatibility commitment • Now at version 1.2
  3. fun main(args: Array<String>) {. val name = "World" if (args.isNotEmpty())

    { name = args[0] } println("Hello, $name!") }. Constant declaration
  4. fun main(args: Array<String>) {. val name = "World" if (args.isNotEmpty())

    { name = args[0] }. println("Hello, $name!") }. Val cannot be reassigned
  5. fun main(args: Array<String>) {. val name = "World" if (args.isNotEmpty())

    { name = args[0] }. println("Hello, $name!") }.
  6. fun main(args: Array<String>) {. val name = if (args.isNotEmpty()) {

    args[0] } else { "World" }. println("Hello, $name!") }.
  7. fun main(args: Array<String>) {. val name = if (args.isNotEmpty()) {

    args[0] } else { "World" }. println("Hello, $name!") }.
  8. fun main(args: Array<String>) {. val name = if (args.isNotEmpty()) {

    args[0] } else { "World" }. println("Hello, $name!") }. Conditional assignment block
  9. fun main(args: Array<String>) { val name = if (args.isNotEmpty()) {

    args[0] } else { "World" }. println("Hello, $name!") }.
  10. class Person(var name: String) fun main(args: Array<String>) { val name

    = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") }.
  11. class Person(var name: String) fun main(args: Array<String>) { val name

    = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Class keyword
  12. class Person(var name: String) fun main(args: Array<String>) { val name

    = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Class name
  13. class Person(var name: String) fun main(args: Array<String>) { val name

    = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Primary constructor
  14. class Person(var name: String) fun main(args: Array<String>) { val name

    = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") } Non-final class member
  15. class Person(var name: String) fun main(args: Array<String>) { val name

    = if (args.isNotEmpty()) args[0] else "World" println("Hello, $name!") }
  16. class Person(var name: String) fun main(args: Array<String>) { val person

    = Person(“Roman”) println("Hello, $name!") }. Instance declaration
  17. class Person(var name: String) fun main(args: Array<String>) { val person

    = Person("Roman") println("Hello, ${person.name}!") }. > Hello, Roman!
  18. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }

    class Person(var name: String) fun main(args: Array<String>) { val person = Person("Roman") println("Hello, ${person.name}!") }.
  19. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }..

    class Person(var name: String). fun main(args: Array<String>) { val person = Person("Roman") println("Hello, ${person.name}!") }.
  20. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }..

    class Person(var name: String, var lang: Language). fun main(args: Array<String>) { val person = Person("Roman") println("Hello, ${person.name}!") }.
  21. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }..

    class Person(var name: String, var lang: Language = Language.EN). fun main(args: Array<String>) { val person = Person("Roman") println("Hello, ${person.name}!") }. Default value
  22. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) fun main(args: Array<String>) { val person = Person("Roman") println("Hello, ${person.name}!") }..
  23. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") }. fun main(args: Array<String>) { val person = Person("Roman") println("Hello, ${person.name}!") }..
  24. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val person = Person("Roman") println("Hello, ${person.name}!") }
  25. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val person = Person("Roman") }
  26. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") } fun main(args: Array<String>) { val person = Person("Roman") person.greet() } > Hello, Roman!
  27. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") }.. fun main(args: Array<String>) { }.
  28. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") }.. fun main(args: Array<String>) { val people = listOf( Person("Roman"), Person("Romario", Language.SP), Person("Roman de Belov", Language.FR) ). }.
  29. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") }.. fun main(args: Array<String>) { val people = listOf( Person("Roman"), Person("Romario", Language.SP), Person("Roman de Belov", Language.FR) ). for (person in people) {. person.greet() }. }.
  30. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") }.. fun main(args: Array<String>) { val people = listOf( Person("Roman"), Person("Romario", Language.SP), Person("Roman de Belov", Language.FR) ). people.forEach {.person -> person.greet() }. }.
  31. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") }.. fun main(args: Array<String>) { val people = listOf( Person("Roman"), Person("Romario", Language.SP), Person("Roman de Belov", Language.FR) ). people.forEach { it.greet() }. }.
  32. enum class Language(val greeting: String) { EN("Hello"), ES("Hola"), FR("Bonjour") }...

    class Person(var name: String, var lang: Language = Language.EN) { fun greet() = println("${lang.greeting}, $name!") }.. fun main(args: Array<String>) { listOf( Person("Roman"), Person("Romario", Language.SP), Person("Roman de Belov", Language.FR) ).forEach { it.greet() }. }. > Hello, Roman! > Hola, Romario! > Bonjour, Roman de Belov!
  33. Java String s = null; s.length(); Errors At Runtime Kotlin

    val s: String s.length() val s: String? = null s.length() Errors At Compile Time = null Nullable type
  34. Check and use val s: String? = … if (s

    != null) { s.length() } Check and exit if (s == null) return s.length() Rock’n’Roll s?.length() s!!.length() (s ?: “…”).length()
  35. public class JavaClass { public String foo(List<String> l) {…} }

    String String? List<String> List<String?> List<String>? List<String?>? Safest! public class JavaClass { public String foo(List<String> l) {…} }
  36. Java Interop: All Nullable javaValue.toString().length() + 1 javaValue?.toString()?.length()!! + 1

    val l: List<String> = javaValue?.getList()!! ArrayList<String?>
  37. Annotations public class JavaClass { public String foo(List<String> l) {…}

    } String String? List<String> List<String?> List<String>? List<String?>? public class JavaClass { @NotNull public String foo(@NotNull List<String> l) {…} }
  38. Dereferencing Platform Values s: String s: String? s: String! s.length()

    s.length() s.length() s?.length() s?.length() s?.length() s!!.length() s!!.length() s!!.length() NPE
  39. Some Notes • Platform Types are Not Denotable! – String!

    is notation, not syntax • Pure Kotlin is Null-Safe • Kotlin+Java is as safe as Java • Annotations Still Applicable – @NotNull String in Java becomes String in Kotlin • Dynamic Type for JavaScript Interop – JS is even unsafer than Java
  40. Interoperability • Use all Java libraries 
 from Kotlin •

    Use Kotlin code from Java • Keep Java and Kotlin code
 side-by-side in project • Search/refactorings work
 cross-language