Kotlin for Android Developers
Michael Evans
@m_evans10
+MichaelEvans
michaelevans.org
Slide 2
Slide 2 text
Kotlin for Android Developers
Michael Evans
LivingSocial
@m_evans10
Slide 3
Slide 3 text
Kotlin for Android Developers
Michael Evans
LivingSocial
@m_evans10
Slide 4
Slide 4 text
Kaitlin for Android Developers
Michael Evans
LivingSocial
@m_evans10
Slide 5
Slide 5 text
Kotlin?
• Statically Typed
• Developed by JetBrains
• 100% interoperable with Java
Slide 6
Slide 6 text
Why Kotlin?
• Mutability problems
• General verbosity
• No control over platform types
Slide 7
Slide 7 text
Nullability
Slide 8
Slide 8 text
Nullability
I call it my billion-dollar mistake. It was the invention of the null
reference in 1965 […] This has led to innumerable errors,
vulnerabilities, and system crashes, which have probably caused
a billion dollars of pain and damage in the last forty years.
Slide 9
Slide 9 text
Why Kotlin?
• Type inference
• Lambdas
• Null safety
• Smart casts
• String templates
• Higher order functions
• Extension functions
• Data classes
• Default Values
fun sum(a: Int, b: Int): Int {
return a + b
}
Syntax
Slide 15
Slide 15 text
fun sum(a: Int, b: Int): Int {
return a + b
}
Syntax
Slide 16
Slide 16 text
Syntax
fun sum(a: Int, b: Int): Int {
return a + b
}
Slide 17
Slide 17 text
fun sum(a: Int, b: Int): Int {
return a + b
}
Syntax
Slide 18
Slide 18 text
fun sum(a: Int, b: Int) = a + b
Syntax
Slide 19
Slide 19 text
Defining Variables
final int a = 1;
int x = 5;
Slide 20
Slide 20 text
Defining Variables
val a: Int = 1
val b = 1
var x = 5
x += 1
final int a = 1;
int x = 5;
Slide 21
Slide 21 text
Defining Variables
val a: Int = 1
val b = 1
var x = 5
x += 1
final int a = 1;
int x = 5;
Slide 22
Slide 22 text
Properties
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Slide 23
Slide 23 text
Properties
var person = Person()
person.name = "Mike"
val name = person.name
class Person {
var name: String = "Ryan"
}
Slide 24
Slide 24 text
String Templates
var person = Person("Mike")
println("Hello my name is ${person.name}")
Slide 25
Slide 25 text
Nullability
Make NullPointerException happen at
compile time, not runtime.
Slide 26
Slide 26 text
val string: String = "Mike"
val another: String = null // does not compile
val nullable: String? = null // ok
Nullability
Slide 27
Slide 27 text
Nullability
if (files != null) {
return files.size
}
Slide 28
Slide 28 text
Nullability
println(person?.name)
val email = data["email"] ?: "[email protected]"
data?.let {
// execute this block if not null
println(files!!.size)
Slide 29
Slide 29 text
Nullability
println(person?.name?.length)
val email = data["email"] ?: "[email protected]"
data?.let {
// execute this block if not null
println(files!!.size)
Slide 30
Slide 30 text
Nullability
println(person?.name?.length)
val email = data["email"] ?: "[email protected]"
data?.let {
// execute this block if not null
println(files!!.size)
Slide 31
Slide 31 text
Nullability
println(person?.name?.length)
val email = data["email"] ?: "[email protected]"
println(files!!.size)
Slide 32
Slide 32 text
fun toast(message: String, length: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, length).show()
}
Default Values
val isEmpty: (String) -> Boolean = { it.isEmpty() }
val exactly10: (String) -> Boolean = { it.length == 10 }
val palindrome: (String) -> Boolean = { isPalindrome(it) }
Function Expressions
Slide 40
Slide 40 text
fun List.filter(predicate: (T) -> Boolean): List {
// ...
}
Higher order functions
Slide 41
Slide 41 text
Higher order functions
fun List.filter(predicate: (T) -> Boolean): List {
val newList = ArrayList()
for (item in this) {
if(predicate(item)) {
newList.add(item)
}
}
return newList
}
Slide 42
Slide 42 text
fun List.filter(predicate: (T) -> Boolean): List {
// ...
}
Higher order functions
val names = listOf("Mike", "John", "Bob")
names.filter { it == "Mike" } // ["Mike"]
names.filter(palindrome) // ["Bob"]
Java Interoperability
class Person {
private String name;
public void setName(String name) {
this.name = name;
}
}
Slide 66
Slide 66 text
var person = Person()
person.name = "name"
Java Interoperability
class Person {
private String name;
public void setName(String name) {
this.name = name;
}
}
Data Classes
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Slide 73
Slide 73 text
Data Classes
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override public String toString() {
return super.toString();
}
}
Slide 74
Slide 74 text
Data Classes
data class Person(val name: String, val age: Int)
Slide 75
Slide 75 text
Convert Java File to Kotlin
Kotlin Scripts for Gradle
Slide 76
Slide 76 text
More Info
• https://kotlinlang.org
• Koans
• https://kotlinlang.org/docs/tutorials/koans.html
• https://leanpub.com/kotlin-for-android-developers
Slide 77
Slide 77 text
Questions?
Michael Evans
@m_evans10
+MichaelEvans
michaelevans.org
Slide 78
Slide 78 text
Questions?
Michael Evans
@m_evans10
+MichaelEvans
michaelevans.org
STICKERS!