6. • 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
26. fun main(args: Array<String>) {.
var name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
27. fun main(args: Array<String>) {.
var name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
28. fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
29. fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
Constant declaration
30. fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}.
println("Hello, $name!")
}.
Val cannot be reassigned
31. fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}.
println("Hello, $name!")
}.
32. fun main(args: Array<String>) {.
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}.
println("Hello, $name!")
}.
33. fun main(args: Array<String>) {.
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}.
println("Hello, $name!")
}.
34. fun main(args: Array<String>) {.
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}.
println("Hello, $name!")
}.
Conditional assignment block
35. fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) { args[0] } else { "World" }.
println("Hello, $name!")
}.
37. class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}.
38. class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Class keyword
39. class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Class name
40. class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Primary constructor
41. 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
42. class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
43. class Person(var name: String)
fun main(args: Array<String>) {
println("Hello, $name!")
}
44. class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Roman")
println("Hello, $name!")
}
45. class Person(var name: String)
fun main(args: Array<String>) {
val person = Person(“Roman”)
println("Hello, $name!")
}.
Instance declaration
46. class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Roman")
println("Hello, $name!")
}.
47. class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Roman")
println("Hello, ${person.name}!")
}.
> Hello, Roman!
48. 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}!")
}.
49. 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}!")
}.
50. 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}!")
}.
51. 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
52. 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}!")
}..
53. 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}!")
}..
54. 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}!")
}
55. 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")
}
56. 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!
57. 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>) {
}.
58. 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)
).
}.
59. 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()
}.
}.
60. 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()
}.
}.
61. 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() }.
}.
62. 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!
66. 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
67. 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()
69. 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) {…}
}
70. Java Interop: All Nullable
javaValue.toString().length() + 1
javaValue?.toString()?.length()!! + 1
val l: List<String> = javaValue?.getList()!!
ArrayList<String?>
72. 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) {…}
}
78. 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
79. 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
80. • Modern
• Concise
• Safe
• Extensible
• Interoperable
• Fun to work with!
Kotlin