SlideShare a Scribd company logo
Kotlin for Android developers
Victor Kropp, JetBrains
@kropp
ROME - APRIL 13/14 2018
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018
Kotlin on
JVM + Android
JS
In development: Kotlin/Native
iOS/macOS/Windows/Linux
Links
Kotlin
https://kotlinlang.org
Kotlin Koans
https://try.kotl.in
Kotlin in Action book
by Dmitry Jemerov & Svetlana Isakova
Sample Java App
package kropp.name.myapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Converting to Kotlin
package kropp.name.myapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Converting to Kotlin
package kropp.name.myapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity {
override fun onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity {
override fun onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity {
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Converting to Kotlin
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Sample Kotlin App
package kropp.name.myapp
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Data classes
data class Person(
var firstName: String,
var lastName: String,
var age: Int
)
Java equivalent
package kotlindemo;
import java.util.Objects;
public class Person {
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(firstName, person.firstName) &&
Objects.equals(lastName, person.lastName);
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName, age);
}
}
Data classes
data class Person(
var firstName: String,
var lastName: String,
var age: Int
)
Properties
class Person {
var firstName: String = ""
}
Properties
public class Person {
private String firstName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Person() { this.firstName = ""; }
}
Make val not var
var mutable: String
val immutable: String
Properties
class Person(
var firstName: String
)
Properties
public class Person {
private String firstName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Person(String firstName) {
this.firstName = firstName;
}
}
Null safety
val canBeNull: String?
val notNull: String
Null safety
fun nullability(str: String?) {
val dot = str.indexOf(".")
}
Null safety
fun nullability(str: String?) {
val dot = str.indexOf(".")
} Only safe (?.) or non-null asserted (!!.) calls are allowed
on a nullable receiver of type String?
Null safety
fun nullability(str: String?) {
val dot = str!!.indexOf(".")
} Non-null asserted call
May throw NullPointerException
Usually a bad style,
use only when you know what you are doing
Null safety
fun nullability(str: String?) {
val dot = str?.indexOf(".")
} Safe call
The result will be null if str is null
Null safety
fun nullability(str: String?) {
val dot = str?.indexOf(".") ?: 0
} Elvis operator
The result will be 0 if str?.indexOf() returns null
Null safety
fun nullability(str: String?) {
val dot = str?.indexOf(".") ?: throw Exception()
}
Type casts
fun cast(obj: Any) {
if (obj is String) {
val dot = obj.indexOf(".")
}
} Smart cast
obj is String inside ‘then’ branch
Type casts
fun cast(obj: Any) {
val str = obj as String
val dot = str.indexOf(".")
}
Type casts
fun cast(obj: Any) {
val str = obj as? String
val dot = str.indexOf(".")
}
Safe cast
str is null if obj is not a String
Extension functions
fun Int.days(): Period = …
fun Period.ago(): Date = …
3.days().ago()
2.months().later()
Extension properties
val Int.days: Period
get() = …
val Period.ago: Date
get() = …
3.days.ago
2.months.later
Lambda expressions
val list = listOf<Int>()
list.filter({ it > 0 })
Lambda expressions
val list = listOf<Int>()
list.filter { it > 0 }
Lambda expressions
val list = listOf<Int>()
list.filter { it > 0 }.map { it*2 }
inline functions
inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean):
List<T> {
val result = mutableListOf<T>()
for (it in this) {
if (predicate(it)) {
result.add(it)
}
}
return result
}
inline functions
inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean):
List<T> {
val result = mutableListOf<T>()
for (it in this) {
if (predicate(it)) {
result.add(it)
}
}
return result
}
Anko is a Kotlin library which makes Android application
development faster and easier.
https://github.com/Kotlin/anko/
Anko
Anko
Anko Commons: a lightweight library with helpers for:
Intents, Dialogs and toasts, Logging, Resources and
dimensions
Anko Layouts: a fast and type-safe way to write dynamic Android
layouts
Anko SQLite: a query DSL and parser collection for Android
SQLite
Anko Coroutines: utilities based on the kotlinx.coroutines library
Anko
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
A set of Kotlin extensions for Android app development
https://github.com/android/android-ktx
Android KTX
Android KTX
sharedPreferences.edit()
.putBoolean("key", value)
.apply()
Android KTX
sharedPreferences.edit {
putBoolean("key", value)
}
Android KTX
val spannedString = buildSpannedString {
bold { "Hello" }
italic { "KTX!" }
}
Kotlin Android Extensions
Kotlin Android Extensions
apply plugin: 'kotlin-android-extensions'
View binding
findViewById<TextView>(R.id.label)
View binding
// Using R.layout.activity_main from the 'main' source set
import kotlinx.android.synthetic.main.activity_main.*
findViewById<TextView>(R.id.label)
View binding
// Using R.layout.activity_main from the 'main' source set
import kotlinx.android.synthetic.main.activity_main.*
findViewById<TextView>(R.id.label)
View binding
// Using R.layout.activity_main from the 'main' source set
import kotlinx.android.synthetic.main.activity_main.*
findViewById<TextView>(R.id.label)
label.text = "Hello!"
View binding
// Using R.layout.activity_main from the 'main' source set
import kotlinx.android.synthetic.main.activity_main.*
label.text = "Hello!"
Parcelable
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Person(
var firstName: String,
var lastName: String,
var age: Int
) : Parcelable
Coroutines (Kotlin 1.1)
Asynchronous programming made easy
Write asynchronous code in synchronous style
Coroutines (Kotlin 1.1)
Asynchronous programming made easy
Write asynchronous code in synchronous style
val team = api.team().await()
val lead = api.profile(team.lead.id).await()
Multi-platform projects
Share code between different platforms
JVM + Android
JS
In development:
iOS/macOS/Windows/Linux Kotlin/Native
Thank you!
Victor Kropp
@kropp
victor.kropp.name
Questions?
Victor Kropp
@kropp
victor.kropp.name

More Related Content

PDF
From java to kotlin beyond alt+shift+cmd+k
PDF
EMFPath
PDF
Feel of Kotlin (Berlin JUG 16 Apr 2015)
PDF
Sneaking inside Kotlin features
PDF
Privet Kotlin (Windy City DevFest)
PDF
Kotlin: a better Java
PPTX
Kotlin collections
PDF
Kotlin, why?
From java to kotlin beyond alt+shift+cmd+k
EMFPath
Feel of Kotlin (Berlin JUG 16 Apr 2015)
Sneaking inside Kotlin features
Privet Kotlin (Windy City DevFest)
Kotlin: a better Java
Kotlin collections
Kotlin, why?

What's hot (20)

PDF
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
PDF
Idiomatic Kotlin
PDF
Kotlin Bytecode Generation and Runtime Performance
PDF
Google Guava for cleaner code
KEY
Google Guava
PDF
Google guava - almost everything you need to know
PDF
Kotlin Data Model
PPTX
Kotlin standard
PPTX
The Groovy Puzzlers – The Complete 01 and 02 Seasons
PDF
Google Guava - Core libraries for Java & Android
PDF
Google guava
PDF
Hammurabi
PDF
Lean way write asynchronous code with Kotlin’s coroutines - Ronen Sabag, Gett
PDF
The core libraries you always wanted - Google Guava
PDF
Pragmatic Real-World Scala (short version)
PDF
The Ring programming language version 1.4.1 book - Part 9 of 31
PDF
Java: Nie popełniaj tych błędów!
PDF
Kotlin Advanced - Apalon Kotlin Sprint Part 3
PDF
First few months with Kotlin - Introduction through android examples
TDC218SP | Trilha Kotlin - DSLs in a Kotlin Way
Idiomatic Kotlin
Kotlin Bytecode Generation and Runtime Performance
Google Guava for cleaner code
Google Guava
Google guava - almost everything you need to know
Kotlin Data Model
Kotlin standard
The Groovy Puzzlers – The Complete 01 and 02 Seasons
Google Guava - Core libraries for Java & Android
Google guava
Hammurabi
Lean way write asynchronous code with Kotlin’s coroutines - Ronen Sabag, Gett
The core libraries you always wanted - Google Guava
Pragmatic Real-World Scala (short version)
The Ring programming language version 1.4.1 book - Part 9 of 31
Java: Nie popełniaj tych błędów!
Kotlin Advanced - Apalon Kotlin Sprint Part 3
First few months with Kotlin - Introduction through android examples
Ad

Similar to Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018 (20)

PDF
Kotlin Generation
ODP
Groovy Ast Transformations (greach)
PPTX
K is for Kotlin
ODP
AST Transformations at JFokus
PDF
can do this in java please thanks in advance The code that y.pdf
ODP
AST Transformations
PDF
#살아있다 #자프링외길12년차 #코프링2개월생존기
PPTX
Nice to meet Kotlin
PDF
The Future of JVM Languages
PDF
Introduction kot iin
PDF
Persisting Data on SQLite using Room
PDF
Kotlin Developer Starter in Android projects
PDF
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
ODP
Scala introduction
PPTX
Android & Kotlin - The code awakens #02
PDF
2014-11-01 01 Денис Нелюбин. О сортах кофе
PPTX
Ian 20150116 java script oop
PDF
Kotlin @ Coupang Backend 2017
PDF
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
PPTX
Kotlin is charming; The reasons Java engineers should start Kotlin.
Kotlin Generation
Groovy Ast Transformations (greach)
K is for Kotlin
AST Transformations at JFokus
can do this in java please thanks in advance The code that y.pdf
AST Transformations
#살아있다 #자프링외길12년차 #코프링2개월생존기
Nice to meet Kotlin
The Future of JVM Languages
Introduction kot iin
Persisting Data on SQLite using Room
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Scala introduction
Android & Kotlin - The code awakens #02
2014-11-01 01 Денис Нелюбин. О сортах кофе
Ian 20150116 java script oop
Kotlin @ Coupang Backend 2017
From Java to Kotlin beyond alt+shift+cmd+k - Kotlin Community Conf Milan
Kotlin is charming; The reasons Java engineers should start Kotlin.
Ad

More from Codemotion (20)

PDF
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
PDF
Pompili - From hero to_zero: The FatalNoise neverending story
PPTX
Pastore - Commodore 65 - La storia
PPTX
Pennisi - Essere Richard Altwasser
PPTX
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
PPTX
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
PPTX
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
PPTX
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
PDF
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
PDF
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
PDF
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
PDF
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
PDF
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
PDF
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
PPTX
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
PPTX
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
PDF
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
PDF
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
PDF
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
PDF
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Pompili - From hero to_zero: The FatalNoise neverending story
Pastore - Commodore 65 - La storia
Pennisi - Essere Richard Altwasser
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019

Recently uploaded (20)

PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Electronic commerce courselecture one. Pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
cuic standard and advanced reporting.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Encapsulation theory and applications.pdf
PDF
KodekX | Application Modernization Development
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Unlocking AI with Model Context Protocol (MCP)
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Electronic commerce courselecture one. Pdf
Empathic Computing: Creating Shared Understanding
cuic standard and advanced reporting.pdf
Chapter 3 Spatial Domain Image Processing.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Advanced methodologies resolving dimensionality complications for autism neur...
MYSQL Presentation for SQL database connectivity
Building Integrated photovoltaic BIPV_UPV.pdf
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Encapsulation theory and applications.pdf
KodekX | Application Modernization Development
Review of recent advances in non-invasive hemoglobin estimation
The Rise and Fall of 3GPP – Time for a Sabbatical?
How UI/UX Design Impacts User Retention in Mobile Apps.pdf

Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018

  • 1. Kotlin for Android developers Victor Kropp, JetBrains @kropp ROME - APRIL 13/14 2018
  • 3. Kotlin on JVM + Android JS In development: Kotlin/Native iOS/macOS/Windows/Linux
  • 5. Sample Java App package kropp.name.myapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
  • 6. Converting to Kotlin package kropp.name.myapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
  • 7. Converting to Kotlin package kropp.name.myapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
  • 8. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 9. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 10. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 11. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 12. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 13. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity { override fun onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 14. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity { override fun onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 15. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity { override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 16. Converting to Kotlin package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 17. Sample Kotlin App package kropp.name.myapp import android.support.v7.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }
  • 18. Data classes data class Person( var firstName: String, var lastName: String, var age: Int )
  • 19. Java equivalent package kotlindemo; import java.util.Objects; public class Person { private String firstName; private String lastName; private int age; public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(firstName, person.firstName) && Objects.equals(lastName, person.lastName); } @Override public int hashCode() { return Objects.hash(firstName, lastName, age); } }
  • 20. Data classes data class Person( var firstName: String, var lastName: String, var age: Int )
  • 21. Properties class Person { var firstName: String = "" }
  • 22. Properties public class Person { private String firstName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public Person() { this.firstName = ""; } }
  • 23. Make val not var var mutable: String val immutable: String
  • 25. Properties public class Person { private String firstName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public Person(String firstName) { this.firstName = firstName; } }
  • 26. Null safety val canBeNull: String? val notNull: String
  • 27. Null safety fun nullability(str: String?) { val dot = str.indexOf(".") }
  • 28. Null safety fun nullability(str: String?) { val dot = str.indexOf(".") } Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
  • 29. Null safety fun nullability(str: String?) { val dot = str!!.indexOf(".") } Non-null asserted call May throw NullPointerException Usually a bad style, use only when you know what you are doing
  • 30. Null safety fun nullability(str: String?) { val dot = str?.indexOf(".") } Safe call The result will be null if str is null
  • 31. Null safety fun nullability(str: String?) { val dot = str?.indexOf(".") ?: 0 } Elvis operator The result will be 0 if str?.indexOf() returns null
  • 32. Null safety fun nullability(str: String?) { val dot = str?.indexOf(".") ?: throw Exception() }
  • 33. Type casts fun cast(obj: Any) { if (obj is String) { val dot = obj.indexOf(".") } } Smart cast obj is String inside ‘then’ branch
  • 34. Type casts fun cast(obj: Any) { val str = obj as String val dot = str.indexOf(".") }
  • 35. Type casts fun cast(obj: Any) { val str = obj as? String val dot = str.indexOf(".") } Safe cast str is null if obj is not a String
  • 36. Extension functions fun Int.days(): Period = … fun Period.ago(): Date = … 3.days().ago() 2.months().later()
  • 37. Extension properties val Int.days: Period get() = … val Period.ago: Date get() = … 3.days.ago 2.months.later
  • 38. Lambda expressions val list = listOf<Int>() list.filter({ it > 0 })
  • 39. Lambda expressions val list = listOf<Int>() list.filter { it > 0 }
  • 40. Lambda expressions val list = listOf<Int>() list.filter { it > 0 }.map { it*2 }
  • 41. inline functions inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { val result = mutableListOf<T>() for (it in this) { if (predicate(it)) { result.add(it) } } return result }
  • 42. inline functions inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { val result = mutableListOf<T>() for (it in this) { if (predicate(it)) { result.add(it) } } return result }
  • 43. Anko is a Kotlin library which makes Android application development faster and easier. https://github.com/Kotlin/anko/ Anko
  • 44. Anko Anko Commons: a lightweight library with helpers for: Intents, Dialogs and toasts, Logging, Resources and dimensions Anko Layouts: a fast and type-safe way to write dynamic Android layouts Anko SQLite: a query DSL and parser collection for Android SQLite Anko Coroutines: utilities based on the kotlinx.coroutines library
  • 45. Anko verticalLayout { val name = editText() button("Say Hello") { onClick { toast("Hello, ${name.text}!") } } }
  • 46. A set of Kotlin extensions for Android app development https://github.com/android/android-ktx Android KTX
  • 49. Android KTX val spannedString = buildSpannedString { bold { "Hello" } italic { "KTX!" } }
  • 51. Kotlin Android Extensions apply plugin: 'kotlin-android-extensions'
  • 53. View binding // Using R.layout.activity_main from the 'main' source set import kotlinx.android.synthetic.main.activity_main.* findViewById<TextView>(R.id.label)
  • 54. View binding // Using R.layout.activity_main from the 'main' source set import kotlinx.android.synthetic.main.activity_main.* findViewById<TextView>(R.id.label)
  • 55. View binding // Using R.layout.activity_main from the 'main' source set import kotlinx.android.synthetic.main.activity_main.* findViewById<TextView>(R.id.label) label.text = "Hello!"
  • 56. View binding // Using R.layout.activity_main from the 'main' source set import kotlinx.android.synthetic.main.activity_main.* label.text = "Hello!"
  • 57. Parcelable import android.os.Parcelable import kotlinx.android.parcel.Parcelize @Parcelize data class Person( var firstName: String, var lastName: String, var age: Int ) : Parcelable
  • 58. Coroutines (Kotlin 1.1) Asynchronous programming made easy Write asynchronous code in synchronous style
  • 59. Coroutines (Kotlin 1.1) Asynchronous programming made easy Write asynchronous code in synchronous style val team = api.team().await() val lead = api.profile(team.lead.id).await()
  • 60. Multi-platform projects Share code between different platforms JVM + Android JS In development: iOS/macOS/Windows/Linux Kotlin/Native