fun safeGetName(person: Person?): String? {
return person?.name
}
Slide 43
Slide 43 text
Elvis Operator
Slide 44
Slide 44 text
fun printName(person: Person?) {
println("Name is ${person?.name
?: "Unknown"}")
}
Slide 45
Slide 45 text
Smart Casts
Slide 46
Slide 46 text
fun printStringLength(any: Any) {
if (any is String) {
println("Length is ${any.length}")
} else {
return println("Oops, not a String")
}
}
Slide 47
Slide 47 text
fun printStringLength(any: Any) {
val asString = any as String
println("Length is ${asString.length}")
}
Slide 48
Slide 48 text
fun printStringLength(any: Any) {
val asString = any as? String
println("Length is ${asString?.length
?: "Unknown"}")
}
Slide 49
Slide 49 text
Classes
Slide 50
Slide 50 text
class Person {
}
Slide 51
Slide 51 text
Final/Public by default
Slide 52
Slide 52 text
Constructors
Slide 53
Slide 53 text
class Fooer(name: String) {
init {
println("Setting up to foo $name")
}
}
Slide 54
Slide 54 text
class Fooer(name: String) {
init {
println("Setting up to foo $name")
}
constructor(name: String, option: String) : this(name) {
println("\tUsing option $option")
}
}
Slide 55
Slide 55 text
Inheritance
Slide 56
Slide 56 text
open class Bar
class Foo : Bar() {
}
Slide 57
Slide 57 text
Properties
Slide 58
Slide 58 text
class Fooer(name: String) {
private val name: String
init {
this.name = name
}
}
Slide 59
Slide 59 text
class Fooer(private val name: String)
Slide 60
Slide 60 text
private var name: String = ""
get() {
println("Returning $name")
return name
}
Slide 61
Slide 61 text
var name: String = ""
private set
Slide 62
Slide 62 text
Delegated Properties
Slide 63
Slide 63 text
class Example {
var p: String by Delegate()
}
Slide 64
Slide 64 text
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
Slide 65
Slide 65 text
var name: String by
Delegates.observable("") {
_, old, new ->
println("$old -> $new")
}
Slide 66
Slide 66 text
Extension Functions
Slide 67
Slide 67 text
fun String.helloize() = "Hello $this"
"World".helloize()
Slide 68
Slide 68 text
Data classes
Slide 69
Slide 69 text
public class Person {
private String name;
private int age;
(...)
}
Slide 70
Slide 70 text
public Person(String name, int age) {
this.name = name;
this.age = age;
}
Slide 71
Slide 71 text
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Slide 72
Slide 72 text
@Override
public boolean equals(Object o) {
(Stuff generated by your IDE)
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + age;
return result;
}
Slide 73
Slide 73 text
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
Slide 74
Slide 74 text
No content
Slide 75
Slide 75 text
data class Person(var name: String,
var age: Int)
Slide 76
Slide 76 text
val john = Person("John", 21)
Slide 77
Slide 77 text
Immutable?
Slide 78
Slide 78 text
private final String name;
public Person withName(String name) {
return new Person(name, this.age);
}
Slide 79
Slide 79 text
data class Person(var name: String,
var age: Int)
Slide 80
Slide 80 text
data class Person(val name: String,
val age: Int)
Slide 81
Slide 81 text
val john = Person("John", 21)
val olderJohn = john.copy(age = 78)
Slide 82
Slide 82 text
Named Arguments
Slide 83
Slide 83 text
public class Person {
public Person(String name,
String lastName,
int age,
Instant birthDate,
(...))
}
Slide 84
Slide 84 text
new Person("John", "Doe",
26, Instant.now(), (...));
fun doWithinLock(lock: Lock,
body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
Slide 98
Slide 98 text
doWithinLock(lock) {
println("Hello lock")
}
Slide 99
Slide 99 text
map.map { (key, value) ->
"$key$value"
}
Slide 100
Slide 100 text
Functions with Receiver
Slide 101
Slide 101 text
class HTML {
var value = ""
fun body(value: String) { this.value = value }
}
fun html(init: HTML.() -> Unit) = HTML().apply {
init()
}
html {
body("Hello world")
}