TOP 10 KOTLIN
STACK OVERFLOW
QUESTIONS
Márton Szabolcs Braun
zsmb.co zsmb13
[email protected]
Slide 2
Slide 2 text
Why do this talk?
Slide 3
Slide 3 text
Why do this talk?
Slide 4
Slide 4 text
Array vs
IntArray
What’s the difference? When do I use which one?
Slide 5
Slide 5 text
Array vs IntArray
Slide 6
Slide 6 text
Array vs IntArray
Array
Slide 7
Slide 7 text
Array vs IntArray
Array Integer[]
Slide 8
Slide 8 text
Array vs IntArray
Array Integer[]
val arrayOfInts: Array = arrayOf(1, 2, 3, 4, 5)
Slide 9
Slide 9 text
Array vs IntArray
Array Integer[]
IntArray
val arrayOfInts: Array = arrayOf(1, 2, 3, 4, 5)
Slide 10
Slide 10 text
Array vs IntArray
Array Integer[]
IntArray int[]
val arrayOfInts: Array = arrayOf(1, 2, 3, 4, 5)
Slide 11
Slide 11 text
Array vs IntArray
Array Integer[]
IntArray int[]
val intArray: IntArray = intArrayOf(1, 2, 3, 4, 5)
val arrayOfInts: Array = arrayOf(1, 2, 3, 4, 5)
Slide 12
Slide 12 text
Array vs IntArray
Slide 13
Slide 13 text
Array vs IntArray
• IntArray
Slide 14
Slide 14 text
Array vs IntArray
• IntArray
Avoids boxing
Slide 15
Slide 15 text
Array vs IntArray
• IntArray
Avoids boxing
Easier to initialize
val intArray = IntArray(10)
val arrayOfInts = Array(5) { i -> i * 2 }
Slide 16
Slide 16 text
Array vs IntArray
• IntArray
Avoids boxing
Easier to initialize
• Array
val intArray = IntArray(10)
val arrayOfInts = Array(5) { i -> i * 2 }
Slide 17
Slide 17 text
Array vs IntArray
• IntArray
Avoids boxing
Easier to initialize
• Array
Might be required by an API
val intArray = IntArray(10)
val arrayOfInts = Array(5) { i -> i * 2 }
Slide 18
Slide 18 text
Array vs IntArray
• IntArray
Avoids boxing
Easier to initialize
• Array
Might be required by an API
Can store nullable values
val intArray = IntArray(10)
val arrayOfInts = Array(5) { i -> i * 2 }
val notPeople: Array = arrayOfNulls(13)
Slide 19
Slide 19 text
Iterable vs
Sequence
What’s the difference? When do I use which one?
Slide 20
Slide 20 text
Iterable vs Sequence
Slide 21
Slide 21 text
Iterable vs Sequence
Iterable
Slide 22
Slide 22 text
Iterable vs Sequence
Iterable java.lang.Iterable
Slide 23
Slide 23 text
Iterable vs Sequence
Eager evaluation
Iterable java.lang.Iterable
Slide 24
Slide 24 text
Iterable vs Sequence
Eager evaluation
Iterable java.lang.Iterable
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Slide 25
Slide 25 text
Iterable vs Sequence
Slide 26
Slide 26 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 27
Slide 27 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 28
Slide 28 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 29
Slide 29 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 30
Slide 30 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 31
Slide 31 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 32
Slide 32 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 33
Slide 33 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 34
Slide 34 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 35
Slide 35 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 36
Slide 36 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 37
Slide 37 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 38
Slide 38 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 39
Slide 39 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 40
Slide 40 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 41
Slide 41 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 42
Slide 42 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 43
Slide 43 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 44
Slide 44 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 45
Slide 45 text
val people: List = getPeople()
val allowedEntrance = people
.filter { it.age >= 21 }
.map { it.name }
.take(5)
Iterable vs Sequence
Slide 46
Slide 46 text
Iterable vs Sequence
Slide 47
Slide 47 text
Iterable vs Sequence
Sequence
Slide 48
Slide 48 text
Iterable vs Sequence
Sequence
Lazy evaluation
Slide 49
Slide 49 text
Iterable vs Sequence
Sequence
Lazy evaluation
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 50
Slide 50 text
Iterable vs Sequence
Sequence
Lazy evaluation
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 51
Slide 51 text
Iterable vs Sequence
Slide 52
Slide 52 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 53
Slide 53 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 54
Slide 54 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 55
Slide 55 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 56
Slide 56 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 57
Slide 57 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 58
Slide 58 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 59
Slide 59 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 60
Slide 60 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 61
Slide 61 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 62
Slide 62 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 63
Slide 63 text
Iterable vs Sequence
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 64
Slide 64 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 65
Slide 65 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 66
Slide 66 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 67
Slide 67 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 68
Slide 68 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 69
Slide 69 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 70
Slide 70 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 71
Slide 71 text
Iterable vs Sequence
val people: List = getPeople()
val allowedEntrance = people.asSequence()
.filter { it.age >= 21 }
.map { it.name }
.take(5)
.toList()
Slide 72
Slide 72 text
Iterable vs Sequence
Slide 73
Slide 73 text
Iterable vs Sequence
• Iterable
Slide 74
Slide 74 text
Iterable vs Sequence
• Iterable
Use by default
Slide 75
Slide 75 text
Iterable vs Sequence
• Iterable
Use by default
Usually the best choice
Slide 76
Slide 76 text
Iterable vs Sequence
• Iterable
Use by default
Usually the best choice
• Sequence
Slide 77
Slide 77 text
Iterable vs Sequence
• Iterable
Use by default
Usually the best choice
• Sequence
To handle an infinite number of elements
Slide 78
Slide 78 text
Iterable vs Sequence
• Iterable
Use by default
Usually the best choice
• Sequence
To handle an infinite number of elements
For huge collections, judiciously
Slide 79
Slide 79 text
Iterable vs Sequence
• Iterable
Use by default
Usually the best choice
• Sequence
To handle an infinite number of elements
For huge collections, judiciously
• Stream
Slide 80
Slide 80 text
Iterable vs Sequence
• Iterable
Use by default
Usually the best choice
• Sequence
To handle an infinite number of elements
For huge collections, judiciously
• Stream
When interoperating with Java
Slide 81
Slide 81 text
Iteration
How can / should I iterate over collections?
Slide 82
Slide 82 text
Iteration
Slide 83
Slide 83 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
Slide 84
Slide 84 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
for (i in 0..args.lastIndex) {
println(args[i])
}
Slide 85
Slide 85 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
for (i in 0..args.lastIndex) {
println(args[i])
}
for (i in 0 until args.size) {
println(args[i])
}
Slide 86
Slide 86 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
for (i in 0..args.lastIndex) {
println(args[i])
}
for (i in 0 until args.size) {
println(args[i])
}
for (i in args.indices) {
println(args[i])
}
Slide 87
Slide 87 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
for (i in 0..args.lastIndex) {
println(args[i])
}
for (i in 0 until args.size) {
println(args[i])
}
for (i in args.indices) {
println(args[i])
}
for (arg in args) {
println(arg)
}
Slide 88
Slide 88 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
for (i in 0..args.lastIndex) {
println(args[i])
}
for (i in 0 until args.size) {
println(args[i])
}
for (i in args.indices) {
println(args[i])
}
for (arg in args) {
println(arg)
}
args.forEach { arg ->
println(arg)
}
Slide 89
Slide 89 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
for (i in 0..args.lastIndex) {
println(args[i])
}
for (i in 0 until args.size) {
println(args[i])
}
for (i in args.indices) {
println(args[i])
}
for (arg in args) {
println(arg)
}
args.forEach { arg ->
println(arg)
}
Slide 90
Slide 90 text
Iteration
for (i in 0..args.size - 1) {
println(args[i])
}
for (i in 0..args.lastIndex) {
println(args[i])
}
for (i in 0 until args.size) {
println(args[i])
}
for (i in args.indices) {
println(args[i])
}
for (arg in args) {
println(arg)
}
args.forEach { arg ->
println(arg)
}
Slide 91
Slide 91 text
SAM conversions
What are SAM conversions?
Slide 92
Slide 92 text
SAM conversions
Slide 93
Slide 93 text
SAM conversions
public interface OnClickListener {
void onClick(Button button);
}
Slide 94
Slide 94 text
SAM conversions
public interface OnClickListener {
void onClick(Button button);
}
public class Button {
public void setListener(OnClickListener listener) {
...
}
}
Slide 95
Slide 95 text
SAM conversions
Slide 96
Slide 96 text
SAM conversions
button.setListener(object : OnClickListener {
override fun onClick(button: Button?) {
println("Clicked!")
}
})
Slide 97
Slide 97 text
SAM conversions
button.setListener(object : OnClickListener {
override fun onClick(button: Button?) {
println("Clicked!")
}
})
button.setListener {
println("Clicked!")
}
Slide 98
Slide 98 text
SAM conversions
button.setListener(object : OnClickListener {
override fun onClick(button: Button?) {
println("Clicked!")
}
})
button.setListener {
println("Clicked!")
}
SAM conversions #1
Why are my listeners not being called?
Slide 101
Slide 101 text
SAM conversions #1
button.setListener {
object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
}
Slide 102
Slide 102 text
SAM conversions #1
button.setListener {
object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
}
Slide 103
Slide 103 text
SAM conversions #1
button.setListener(object : OnClickListener {
override fun onClick(button: Button?) {
object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
}
})
Slide 104
Slide 104 text
SAM conversions #1
button.setListener(object : OnClickListener {
override fun onClick(button: Button?) {
val listener = object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
}
})
Slide 105
Slide 105 text
SAM conversions #1
button.setListener(object : OnClickListener {
override fun onClick(button: Button?) {
val listener = object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
listener.onClick(...)
}
})
Slide 106
Slide 106 text
SAM conversions #1
button.setListener(object : OnClickListener {
override fun onClick(button: Button?) {
object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
}
})
Slide 107
Slide 107 text
SAM conversions #1
button.setListener {
object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
}
Slide 108
Slide 108 text
SAM conversions #1
button.setListener {
object : OnClickListener {
override fun onClick(button: Button) {
println("Clicked!")
}
})
}
button.setListener {
fun onClick(button: Button) {
println("Clicked!")
}
}
Slide 109
Slide 109 text
SAM conversions #2
Why am I getting a return type error?
Slide 110
Slide 110 text
SAM conversions #2
public interface OnClickListener {
void onClick(Button button);
}
Slide 111
Slide 111 text
SAM conversions #2
public interface OnClickListener {
boolean onClick(Button button);
}
Slide 112
Slide 112 text
SAM conversions #2
public interface OnClickListener {
boolean onClick(Button button);
}
button.setListener {
println("Clicked!")
}
Slide 113
Slide 113 text
SAM conversions #2
public interface OnClickListener {
boolean onClick(Button button);
}
button.setListener {
println("Clicked!")
}
Kotlin: Type mismatch: inferred type is Unit but
Boolean was expected
Slide 114
Slide 114 text
SAM conversions #2
public interface OnClickListener {
boolean onClick(Button button);
}
button.setListener {
println("Clicked!")
true
}
Slide 115
Slide 115 text
SAM conversions #2
public interface OnClickListener {
boolean onClick(Button button);
}
button.setListener {
println("Clicked!")
true
}
Slide 116
Slide 116 text
Replacing statics
How do I create static functions and variables in Kotlin?
Slide 117
Slide 117 text
Replacing statics
class Foo {
companion object {
fun x() { ... }
}
fun y() { ... }
}
Slide 118
Slide 118 text
Replacing statics
class Foo {
companion object {
fun x() { ... }
}
fun y() { ... }
}
Foo.x()
Slide 119
Slide 119 text
Replacing statics
class Foo {
companion object {
fun x() { ... }
}
fun y() { ... }
}
object Foo {
fun x() { ... }
}
Foo.x()
Foo.x()
Slide 120
Slide 120 text
Replacing statics
class Foo {
companion object {
fun x() { ... }
}
fun y() { ... }
}
object Foo {
fun x() { ... }
}
fun x() { ... }
Foo.x()
Foo.x()
x()
Slide 121
Slide 121 text
Replacing statics
class Foo {
companion object {
fun x() { ... }
}
fun y() { ... }
}
object Foo {
fun x() { ... }
}
fun x() { ... }
Foo.x()
Foo.x()
x()
Slide 122
Slide 122 text
Function declaration reference
Declaration Kotlin usage Java usage
Companion object Foo.f() Foo.Companion.f();
Companion object with @JvmStatic Foo.f() Foo.f();
Object Foo.f() Foo.INSTANCE.f();
Object with @JvmStatic Foo.f() Foo.f();
Top level function f() UtilKt.f();
Top level function with @JvmName* f() Util.f();
* With the @JvmName annotation on the file use-site target
Slide 123
Slide 123 text
Variable declaration reference
Declaration Kotlin usage Java usage
Companion object X.x X.Companion.getX();
Companion object with @JvmStatic X.x X.getX();
Companion object with @JvmField X.x X.x;
Companion object with const X.x X.x;
Object X.x X.INSTANCE.getX();
Object with @JvmStatic X.x X.getX();
Object with @JvmField X.x X.x;
Object with const X.x X.x;
Top level variable x ConstKt.getX();
Top level variable with @JvmField x ConstKt.x;
Top level variable with const x ConstKt.x;
Top level variable with @JvmName* x Const.getX();
Top level variable with @JvmName* and @JvmField x Const.x;
Top level variable with @JvmName* and const x Const.x;
* With the @JvmName annotation on the file use-site target
Slide 124
Slide 124 text
Smart casts on
mutable properties
Why are smart casts not working?
Slide 125
Slide 125 text
Smart casts on mutable properties
class Dog(var toy: Toy? = null) {
fun play() {
if (toy != null) {
toy.chew()
}
}
}
Slide 126
Slide 126 text
Smart casts on mutable properties
class Dog(var toy: Toy? = null) {
fun play() {
if (toy != null) {
toy.chew()
}
}
}
Kotlin: Smart cast to 'Toy' is impossible, because 'toy' is
a mutable property that could have been changed by this time
Slide 127
Slide 127 text
Smart casts on mutable properties
class Dog(val toy: Toy? = null) {
fun play() {
if (toy != null) {
toy.chew()
}
}
}
Slide 128
Slide 128 text
Smart casts on mutable properties
class Dog(var toy: Toy? = null) {
fun play() {
if (toy != null) {
toy.chew()
}
}
}
Slide 129
Slide 129 text
Smart casts on mutable properties
class Dog(var toy: Toy? = null) {
fun play() {
val _toy = toy
if (_toy != null) {
_toy.chew()
}
}
}
Slide 130
Slide 130 text
Smart casts on mutable properties
class Dog(var toy: Toy? = null) {
fun play() {
toy?.let {
it.chew()
}
}
}
Slide 131
Slide 131 text
Smart casts on mutable properties
class Dog(var toy: Toy? = null) {
fun play() {
toy?.chew()
}
}
Slide 132
Slide 132 text
Smart casts on mutable properties
class Dog(var toy: Toy? = null) {
fun play() {
toy?.let {
it.chew()
it.chew()
it.chew()
}
}
}
Slide 133
Slide 133 text
null!!
Why am I getting NullPointerExceptions?
Slide 134
Slide 134 text
null!!
Slide 135
Slide 135 text
null!!
class Episode {
var airdate: Date = null!!
}
Slide 136
Slide 136 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
Slide 137
Slide 137 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
Date?
Slide 138
Slide 138 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
WeekDay
Date?
Slide 139
Slide 139 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
Date
WeekDay
Date?
Slide 140
Slide 140 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
Date
Slide 141
Slide 141 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
Date date as Date
Slide 142
Slide 142 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
Date date as Date
throw NullPointerException()
Slide 143
Slide 143 text
null!!
class Episode {
var airdate: Date = null!!
}
fun getWeekDay(date: Date?): WeekDay {
return date!!.getWeekDay()
}
Date
Slide 144
Slide 144 text
null!!
class Episode {
var airdate: Date = null!!
}
Slide 145
Slide 145 text
null!!
class Episode {
var airdate: Date = null!!
}
Slide 146
Slide 146 text
null!!
class Episode {
var airdate: Date = throw KotlinNullPointerException()
}
Slide 147
Slide 147 text
null!!
class Episode {
lateinit var airdate: Date
}
Slide 148
Slide 148 text
Platform types in
overrides
How do I choose the right type when overriding Java methods?
Slide 149
Slide 149 text
Platform types in overrides
Slide 150
Slide 150 text
Platform types in overrides
public interface OnClickListener {
void onClick(Button button);
}
Slide 151
Slide 151 text
Platform types in overrides
public interface OnClickListener {
void onClick(Button button);
}
class KtListener : OnClickListener {
override fun onClick(button: Button?): Unit {
val name = button?.name ?: "Unknown button"
println("Clicked ${name}")
}
}
Slide 152
Slide 152 text
Platform types in overrides
public interface OnClickListener {
void onClick(Button button);
}
class KtListener : OnClickListener {
override fun onClick(button: Button?): Unit {
val name = button?.name ?: "Unknown button"
println("Clicked ${name}")
}
}
Slide 153
Slide 153 text
Platform types in overrides
public interface OnClickListener {
void onClick(Button button);
}
class KtListener : OnClickListener {
override fun onClick(button: Button?): Unit {
val name = button?.name ?: "Unknown button"
println("Clicked ${name}")
}
}
Slide 154
Slide 154 text
Platform types in overrides
public interface OnClickListener {
void onClick(Button button);
}
class KtListener : OnClickListener {
override fun onClick(button: Button): Unit {
val name = button.name
println("Clicked ${name}")
}
}
Slide 155
Slide 155 text
Import aliases
What can I do about imports with conflicting names?
Import aliases
package com.example.code
fun String.indent()
: String { ... }
package com.example.square
fun String.indent()
: String { ... }
import com.example.code.indent as indent4
import com.example.square.indent as indent2
"hello".indent4()
"world".indent2()
Slide 162
Slide 162 text
Import aliases
import java.util.Date as UtilDate
import java.sql.Date as SqlDate
fun matches(date1: UtilDate, date2: SqlDate): Boolean {
...
}
Slide 163
Slide 163 text
Kotlin vs Java for
Android development
Please help I just started
Slide 164
Slide 164 text
Kotlin vs Java for Android development
Slide 165
Slide 165 text
Kotlin vs Java for Android development
Slide 166
Slide 166 text
Recap
• 1. Array vs IntArray
• 2. Iterable vs Sequence
• 3. Iteration
• 4. SAM conversions
• 5. Replacing statics
• 6. Smart casts on mutable properties
• 7. null!!
• 8. Platform types in overrides
• 9. Import aliases
• 10. Kotlin vs Java for Android development
Slide 167
Slide 167 text
References
• Top 10 Kotlin Stack Overflow questions, article series
https://zsmb.co/top-10-kotlin-stack-overflow-questions-1/
• Kotlin tag on Stack Overflow
https://stackoverflow.com/questions/tagged/kotlin