SlideShare a Scribd company logo
1 of 83
Download to read offline
Kotlin.
Что это и зачем?
—
Роман Белов,
PMM at Kotlin
JetBrains Open Day
Moscow
WHO R U?
В разделе личные качества
стоит только одно слово:
Прагматичен
“We’ve built tools to
support so many nice
languages, and we’re still
using Java”
JetBrains, 2010
Hello Kotlin!
• 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
Kotlin on Android
Gradle Script Kotlin
…
Server
Android
iOS Browser
Kotlin/JVM
Kotlin/JVM
Kotlin/Native Kotlin/JS
Multiplatform projects
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
> Hello, World!
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Function keyword
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Function name
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Argument name
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Argument type
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
Return type
fun main(args: Array<String>): Unit {
println("Hello, World!")
}
fun main(args: Array<String>): Unit {.
println("Hello, World!")
}.
Unit inferred
fun main(args: Array<String>) {.
println("Hello, World!")
}.
fun main(args: Array<String>) {.
println("Hello, World!")
}.
fun main(args: Array<String>) {.
println("Hello, World!")
}.
fun main(args: Array<String>) {.
var name = "World"
println("Hello, $name!")
}.
fun main(args: Array<String>) {.
var name = "World"
println("Hello, $name!")
}.
Variable declaration
fun main(args: Array<String>) {.
var name = "World"
println("Hello, $name!")
}.
String interpolation
fun main(args: Array<String>) {.
var name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
fun main(args: Array<String>) {.
var name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}
println("Hello, $name!")
}.
Constant declaration
fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}.
println("Hello, $name!")
}.
Val cannot be reassigned
fun main(args: Array<String>) {.
val name = "World"
if (args.isNotEmpty()) {
name = args[0]
}.
println("Hello, $name!")
}.
fun main(args: Array<String>) {.
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}.
println("Hello, $name!")
}.
fun main(args: Array<String>) {.
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}.
println("Hello, $name!")
}.
fun main(args: Array<String>) {.
val name = if (args.isNotEmpty()) {
args[0]
} else {
"World"
}.
println("Hello, $name!")
}.
Conditional assignment block
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) { args[0] } else { "World" }.
println("Hello, $name!")
}.
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}.
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}.
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Class keyword
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Class name
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
Primary constructor
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
class Person(var name: String)
fun main(args: Array<String>) {
val name = if (args.isNotEmpty()) args[0] else "World"
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Roman")
println("Hello, $name!")
}
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person(“Roman”)
println("Hello, $name!")
}.
Instance declaration
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Roman")
println("Hello, $name!")
}.
class Person(var name: String)
fun main(args: Array<String>) {
val person = Person("Roman")
println("Hello, ${person.name}!")
}.
> Hello, Roman!
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}!")
}.
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}!")
}.
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}!")
}.
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
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}!")
}..
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}!")
}..
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}!")
}
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")
}
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!
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>) {
}.
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)
).
}.
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()
}.
}.
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()
}.
}.
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() }.
}.
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!
Null-safety
“Billion dollar mistake”
— Sir C. A. R. Hoare
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
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()
public class JavaClass {
public String foo(List<String> l) {…}
}
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) {…}
}
Java Interop: All Nullable
javaValue.toString().length() + 1
javaValue?.toString()?.length()!! + 1
val l: List<String> = javaValue?.getList()!!
ArrayList<String?>
Your safest option doesn’t work!
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) {…}
}
Annotations
are cumbersome
and don’t
really help!
• Null-safety
• Convenience
• Java Interop
Pick Two
Platform Types!
Thanks to
Dr. Ross Tate of
String! List<String!>!
public class JavaClass {
public String foo(List<String> l) {…}
}
Java: Platform Types
Platform Type
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
Assignability
String String?
String!
Platform Type
Not Transitive!
NPE
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
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
• Modern
• Concise
• Safe
• Extensible
• Interoperable
• Fun to work with!
Kotlin
Pragmatism
Resources
• kotlinlang.org
• discuss.kotlinlang.org
• try.kotlinlang.org
• slack.kotlinlang.org
• kotlinconf.com

(3-5 Oct. 2018, Amsterdam)
Спасибо
за внимание
—

More Related Content

What's hot

Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosEdgar Suarez
 
Presentation on php string function part-1
Presentation on php string function part-1Presentation on php string function part-1
Presentation on php string function part-1Mysoftheaven (BD) Ltd.
 
NUS iOS Swift Talk
NUS iOS Swift TalkNUS iOS Swift Talk
NUS iOS Swift TalkGabriel Lim
 
PHP Basics and Demo HackU
PHP Basics and Demo HackUPHP Basics and Demo HackU
PHP Basics and Demo HackUAnshu Prateek
 
Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Plataformatec
 
Kotlin: maybe it's the right time
Kotlin: maybe it's the right timeKotlin: maybe it's the right time
Kotlin: maybe it's the right timeDavide Cerbo
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kirill Rozov
 
Casting for not so strange actors
Casting for not so strange actorsCasting for not so strange actors
Casting for not so strange actorszucaritask
 
Nik Graf - Get started with Reason and ReasonReact
Nik Graf - Get started with Reason and ReasonReactNik Graf - Get started with Reason and ReasonReact
Nik Graf - Get started with Reason and ReasonReactOdessaJS Conf
 
Functional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heavenFunctional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heavenPawel Szulc
 
ZIO Prelude - ZIO World 2021
ZIO Prelude - ZIO World 2021ZIO Prelude - ZIO World 2021
ZIO Prelude - ZIO World 2021Jorge Vásquez
 
Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!Jorge Vásquez
 
GDI Seattle - Intro to JavaScript Class 2
GDI Seattle - Intro to JavaScript Class 2GDI Seattle - Intro to JavaScript Class 2
GDI Seattle - Intro to JavaScript Class 2Heather Rock
 
Ruby is Awesome
Ruby is AwesomeRuby is Awesome
Ruby is AwesomeAstrails
 
python beginner talk slide
python beginner talk slidepython beginner talk slide
python beginner talk slidejonycse
 
DBIx::Class beginners
DBIx::Class beginnersDBIx::Class beginners
DBIx::Class beginnersleo lapworth
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecLoïc Descotte
 

What's hot (20)

Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
 
Presentation on php string function part-1
Presentation on php string function part-1Presentation on php string function part-1
Presentation on php string function part-1
 
NUS iOS Swift Talk
NUS iOS Swift TalkNUS iOS Swift Talk
NUS iOS Swift Talk
 
PHP Basics and Demo HackU
PHP Basics and Demo HackUPHP Basics and Demo HackU
PHP Basics and Demo HackU
 
The jQuery Divide
The jQuery DivideThe jQuery Divide
The jQuery Divide
 
Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011Writing your own programming language to understand Ruby better - Euruko 2011
Writing your own programming language to understand Ruby better - Euruko 2011
 
Kotlin: maybe it's the right time
Kotlin: maybe it's the right timeKotlin: maybe it's the right time
Kotlin: maybe it's the right time
 
Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2Kotlin Basics - Apalon Kotlin Sprint Part 2
Kotlin Basics - Apalon Kotlin Sprint Part 2
 
Casting for not so strange actors
Casting for not so strange actorsCasting for not so strange actors
Casting for not so strange actors
 
Nik Graf - Get started with Reason and ReasonReact
Nik Graf - Get started with Reason and ReasonReactNik Graf - Get started with Reason and ReasonReact
Nik Graf - Get started with Reason and ReasonReact
 
Functional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heavenFunctional Programming & Event Sourcing - a pair made in heaven
Functional Programming & Event Sourcing - a pair made in heaven
 
Ruby
RubyRuby
Ruby
 
ZIO Prelude - ZIO World 2021
ZIO Prelude - ZIO World 2021ZIO Prelude - ZIO World 2021
ZIO Prelude - ZIO World 2021
 
Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!Be Smart, Constrain Your Types to Free Your Brain!
Be Smart, Constrain Your Types to Free Your Brain!
 
Perl_Tutorial_v1
Perl_Tutorial_v1Perl_Tutorial_v1
Perl_Tutorial_v1
 
GDI Seattle - Intro to JavaScript Class 2
GDI Seattle - Intro to JavaScript Class 2GDI Seattle - Intro to JavaScript Class 2
GDI Seattle - Intro to JavaScript Class 2
 
Ruby is Awesome
Ruby is AwesomeRuby is Awesome
Ruby is Awesome
 
python beginner talk slide
python beginner talk slidepython beginner talk slide
python beginner talk slide
 
DBIx::Class beginners
DBIx::Class beginnersDBIx::Class beginners
DBIx::Class beginners
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
 

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

Scala in a Java 8 World
Scala in a Java 8 WorldScala in a Java 8 World
Scala in a Java 8 WorldDaniel Blyth
 
Derping With Kotlin
Derping With KotlinDerping With Kotlin
Derping With KotlinRoss Tuck
 
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018 Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018 Codemotion
 
An Introduction to Scala (2014)
An Introduction to Scala (2014)An Introduction to Scala (2014)
An Introduction to Scala (2014)William Narmontas
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldBTI360
 
Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)intelliyole
 
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기Suyeol Jeon
 
Introduction to Groovy
Introduction to GroovyIntroduction to Groovy
Introduction to GroovyAnton Arhipov
 
Naïveté vs. Experience
Naïveté vs. ExperienceNaïveté vs. Experience
Naïveté vs. ExperienceMike Fogus
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's JavaSven Efftinge
 
Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Chang W. Doh
 
Ruby 程式語言入門導覽
Ruby 程式語言入門導覽Ruby 程式語言入門導覽
Ruby 程式語言入門導覽Wen-Tien Chang
 
Class 5 - PHP Strings
Class 5 - PHP StringsClass 5 - PHP Strings
Class 5 - PHP StringsAhmed Swilam
 
Shoulders of giants: Languages Kotlin learned from
Shoulders of giants: Languages Kotlin learned fromShoulders of giants: Languages Kotlin learned from
Shoulders of giants: Languages Kotlin learned fromAndrey Breslav
 
CodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical GroovyCodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical GroovyCodecamp Romania
 

Similar to Kotlin Programming Language. What it is all about. Roman Belov, PMM in Kotlin (20)

Scala in a Java 8 World
Scala in a Java 8 WorldScala in a Java 8 World
Scala in a Java 8 World
 
Derping With Kotlin
Derping With KotlinDerping With Kotlin
Derping With Kotlin
 
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018 Meetup di GDG Italia - Leonardo Pirro -  Codemotion Rome 2018
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018
 
An Introduction to Scala (2014)
An Introduction to Scala (2014)An Introduction to Scala (2014)
An Introduction to Scala (2014)
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 World
 
Presentatie - Introductie in Groovy
Presentatie - Introductie in GroovyPresentatie - Introductie in Groovy
Presentatie - Introductie in Groovy
 
Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)Feel of Kotlin (Berlin JUG 16 Apr 2015)
Feel of Kotlin (Berlin JUG 16 Apr 2015)
 
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
Swift - 혼자 공부하면 분명히 안할테니까 같이 공부하기
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Swift Study #7
Swift Study #7Swift Study #7
Swift Study #7
 
Introduction to Groovy
Introduction to GroovyIntroduction to Groovy
Introduction to Groovy
 
Naïveté vs. Experience
Naïveté vs. ExperienceNaïveté vs. Experience
Naïveté vs. Experience
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's Java
 
Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요
 
Ruby 程式語言入門導覽
Ruby 程式語言入門導覽Ruby 程式語言入門導覽
Ruby 程式語言入門導覽
 
Class 5 - PHP Strings
Class 5 - PHP StringsClass 5 - PHP Strings
Class 5 - PHP Strings
 
Benefits of Kotlin
Benefits of KotlinBenefits of Kotlin
Benefits of Kotlin
 
Shoulders of giants: Languages Kotlin learned from
Shoulders of giants: Languages Kotlin learned fromShoulders of giants: Languages Kotlin learned from
Shoulders of giants: Languages Kotlin learned from
 
CodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical GroovyCodeCamp Iasi 10 march 2012 - Practical Groovy
CodeCamp Iasi 10 march 2012 - Practical Groovy
 
Functional programming in java
Functional programming in javaFunctional programming in java
Functional programming in java
 

More from JetBrains Russia

(No) Few Processes is yet a Process. Sergey Coox, .Net Department Lead
(No) Few Processes is yet a Process. Sergey Coox, .Net Department Lead(No) Few Processes is yet a Process. Sergey Coox, .Net Department Lead
(No) Few Processes is yet a Process. Sergey Coox, .Net Department LeadJetBrains Russia
 
How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider
How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider
How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider JetBrains Russia
 
Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead
Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead
Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead JetBrains Russia
 
Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...
Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...
Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...JetBrains Russia
 
Xodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team Lead
Xodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team LeadXodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team Lead
Xodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team LeadJetBrains Russia
 
DevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCity
DevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCityDevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCity
DevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCityJetBrains Russia
 
DevOps в проекте Upsource. Андрей Сизов, System Administrator
DevOps в проекте Upsource. Андрей Сизов, System AdministratorDevOps в проекте Upsource. Андрей Сизов, System Administrator
DevOps в проекте Upsource. Андрей Сизов, System AdministratorJetBrains Russia
 
Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...
Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...
Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...JetBrains Russia
 
Kotlin Native. Святослав Щербина, Senior Software Developer, Kotlin
Kotlin Native. Святослав Щербина, Senior Software Developer, KotlinKotlin Native. Святослав Щербина, Senior Software Developer, Kotlin
Kotlin Native. Святослав Щербина, Senior Software Developer, KotlinJetBrains Russia
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...JetBrains Russia
 
От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...
От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...
От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...JetBrains Russia
 
Эволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEA
Эволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEAЭволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEA
Эволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEAJetBrains Russia
 
Вступление. Максим Шафиров, СЕО
Вступление. Максим Шафиров, СЕОВступление. Максим Шафиров, СЕО
Вступление. Максим Шафиров, СЕОJetBrains Russia
 

More from JetBrains Russia (13)

(No) Few Processes is yet a Process. Sergey Coox, .Net Department Lead
(No) Few Processes is yet a Process. Sergey Coox, .Net Department Lead(No) Few Processes is yet a Process. Sergey Coox, .Net Department Lead
(No) Few Processes is yet a Process. Sergey Coox, .Net Department Lead
 
How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider
How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider
How We Improve Performance in Rider. Andrey Akinshin, Senior Developer in Rider
 
Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead
Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead
Feature Evolution in IntelliJ IDEA, Nikolay Chashnikov, IDEA Core Team Lead
 
Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...
Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...
Full-Stack Application Development Experience in Kotlin, Sergey Shkredov, New...
 
Xodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team Lead
Xodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team LeadXodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team Lead
Xodus: a Database to Store YouTrack Bugs. Maxim Mazin, YouTrack Team Lead
 
DevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCity
DevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCityDevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCity
DevOps в команде TeamCity. Евгений Кошкин, Senior Software Developer, TeamCity
 
DevOps в проекте Upsource. Андрей Сизов, System Administrator
DevOps в проекте Upsource. Андрей Сизов, System AdministratorDevOps в проекте Upsource. Андрей Сизов, System Administrator
DevOps в проекте Upsource. Андрей Сизов, System Administrator
 
Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...
Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...
Зачем нам (и вам) нужны сообщества? или построение отношений с community как ...
 
Kotlin Native. Святослав Щербина, Senior Software Developer, Kotlin
Kotlin Native. Святослав Щербина, Senior Software Developer, KotlinKotlin Native. Святослав Щербина, Senior Software Developer, Kotlin
Kotlin Native. Святослав Щербина, Senior Software Developer, Kotlin
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...
От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...
От идеи до релиза. Как в JetBrains появляются новые фичи и продукты. Констант...
 
Эволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEA
Эволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEAЭволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEA
Эволюция фич в IntelliJ IDEA. Николай Чашников, Team Leader Core Team, IDEA
 
Вступление. Максим Шафиров, СЕО
Вступление. Максим Шафиров, СЕОВступление. Максим Шафиров, СЕО
Вступление. Максим Шафиров, СЕО
 

Recently uploaded

Churning of Butter, Factors affecting .
Churning of Butter, Factors affecting  .Churning of Butter, Factors affecting  .
Churning of Butter, Factors affecting .Satyam Kumar
 
EduAI - E learning Platform integrated with AI
EduAI - E learning Platform integrated with AIEduAI - E learning Platform integrated with AI
EduAI - E learning Platform integrated with AIkoyaldeepu123
 
What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxwendy cai
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...asadnawaz62
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxKartikeyaDwivedi3
 
pipeline in computer architecture design
pipeline in computer architecture  designpipeline in computer architecture  design
pipeline in computer architecture designssuser87fa0c1
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSCAESB
 
Internship report on mechanical engineering
Internship report on mechanical engineeringInternship report on mechanical engineering
Internship report on mechanical engineeringmalavadedarshan25
 
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)Dr SOUNDIRARAJ N
 
Heart Disease Prediction using machine learning.pptx
Heart Disease Prediction using machine learning.pptxHeart Disease Prediction using machine learning.pptx
Heart Disease Prediction using machine learning.pptxPoojaBan
 
Sachpazis Costas: Geotechnical Engineering: A student's Perspective Introduction
Sachpazis Costas: Geotechnical Engineering: A student's Perspective IntroductionSachpazis Costas: Geotechnical Engineering: A student's Perspective Introduction
Sachpazis Costas: Geotechnical Engineering: A student's Perspective IntroductionDr.Costas Sachpazis
 
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)dollysharma2066
 
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerStudy on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerAnamika Sarkar
 
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ
 
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfCCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfAsst.prof M.Gokilavani
 
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfCCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfAsst.prof M.Gokilavani
 
Risk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdfRisk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdfROCENODodongVILLACER
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort servicejennyeacort
 

Recently uploaded (20)

Design and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdfDesign and analysis of solar grass cutter.pdf
Design and analysis of solar grass cutter.pdf
 
Churning of Butter, Factors affecting .
Churning of Butter, Factors affecting  .Churning of Butter, Factors affecting  .
Churning of Butter, Factors affecting .
 
EduAI - E learning Platform integrated with AI
EduAI - E learning Platform integrated with AIEduAI - E learning Platform integrated with AI
EduAI - E learning Platform integrated with AI
 
What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptx
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...
 
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Serviceyoung call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
young call girls in Rajiv Chowk🔝 9953056974 🔝 Delhi escort Service
 
Concrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptxConcrete Mix Design - IS 10262-2019 - .pptx
Concrete Mix Design - IS 10262-2019 - .pptx
 
pipeline in computer architecture design
pipeline in computer architecture  designpipeline in computer architecture  design
pipeline in computer architecture design
 
GDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentationGDSC ASEB Gen AI study jams presentation
GDSC ASEB Gen AI study jams presentation
 
Internship report on mechanical engineering
Internship report on mechanical engineeringInternship report on mechanical engineering
Internship report on mechanical engineering
 
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
 
Heart Disease Prediction using machine learning.pptx
Heart Disease Prediction using machine learning.pptxHeart Disease Prediction using machine learning.pptx
Heart Disease Prediction using machine learning.pptx
 
Sachpazis Costas: Geotechnical Engineering: A student's Perspective Introduction
Sachpazis Costas: Geotechnical Engineering: A student's Perspective IntroductionSachpazis Costas: Geotechnical Engineering: A student's Perspective Introduction
Sachpazis Costas: Geotechnical Engineering: A student's Perspective Introduction
 
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
Call Us ≽ 8377877756 ≼ Call Girls In Shastri Nagar (Delhi)
 
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerStudy on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
 
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
 
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfCCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
 
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdfCCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
CCS355 Neural Network & Deep Learning UNIT III notes and Question bank .pdf
 
Risk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdfRisk Assessment For Installation of Drainage Pipes.pdf
Risk Assessment For Installation of Drainage Pipes.pdf
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
 

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

  • 1. Kotlin. Что это и зачем? — Роман Белов, PMM at Kotlin JetBrains Open Day Moscow
  • 3. В разделе личные качества стоит только одно слово: Прагматичен
  • 4. “We’ve built tools to support so many nice languages, and we’re still using Java” JetBrains, 2010
  • 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
  • 8.
  • 10.
  • 12. fun main(args: Array<String>): Unit { println("Hello, World!") } > Hello, World!
  • 13. fun main(args: Array<String>): Unit { println("Hello, World!") } Function keyword
  • 14. fun main(args: Array<String>): Unit { println("Hello, World!") } Function name
  • 15. fun main(args: Array<String>): Unit { println("Hello, World!") } Argument name
  • 16. fun main(args: Array<String>): Unit { println("Hello, World!") } Argument type
  • 17. fun main(args: Array<String>): Unit { println("Hello, World!") } Return type
  • 18. fun main(args: Array<String>): Unit { println("Hello, World!") }
  • 19. fun main(args: Array<String>): Unit {. println("Hello, World!") }. Unit inferred
  • 20. fun main(args: Array<String>) {. println("Hello, World!") }.
  • 21. fun main(args: Array<String>) {. println("Hello, World!") }.
  • 22. fun main(args: Array<String>) {. println("Hello, World!") }.
  • 23. fun main(args: Array<String>) {. var name = "World" println("Hello, $name!") }.
  • 24. fun main(args: Array<String>) {. var name = "World" println("Hello, $name!") }. Variable declaration
  • 25. fun main(args: Array<String>) {. var name = "World" println("Hello, $name!") }. String interpolation
  • 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!") }.
  • 36. 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!
  • 64.
  • 65. “Billion dollar mistake” — Sir C. A. R. Hoare
  • 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()
  • 68. public class JavaClass { public String foo(List<String> l) {…} }
  • 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?>
  • 71. Your safest option doesn’t work!
  • 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) {…} }
  • 74. • Null-safety • Convenience • Java Interop Pick Two Platform Types! Thanks to Dr. Ross Tate of
  • 75. String! List<String!>! public class JavaClass { public String foo(List<String> l) {…} } Java: Platform Types Platform Type
  • 76. 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
  • 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
  • 82. Resources • kotlinlang.org • discuss.kotlinlang.org • try.kotlinlang.org • slack.kotlinlang.org • kotlinconf.com
 (3-5 Oct. 2018, Amsterdam)