-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathLambdas.kt
153 lines (120 loc) · 4.17 KB
/
Lambdas.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import java.lang.Exception
class Lambdas {
fun test() {
println("Higher-order functions")
handlerError {
sendLog(null)
}
handlerError {
getDailyReport()
}
println("")
println("Replace callbacks - Java style")
val javaButton = JavaButton()
javaButton.setOnClickListener(object : OnClickListener {
override fun onClick() = println("onClick")
})
javaButton.monkeyTest()
println("")
println("Replace callbacks - Kotlin style")
// By using higher-order functions, the preceding code could be optimised
val kotlinButton = KotlinButton()
kotlinButton.setOnClickListener {
println("onClick")
}
kotlinButton.monkeyTest()
println("")
println("Lambda functions")
val add1 = { a: Int, b: Int -> a + b }
println(add1(3, 7))
val add2 = this::sum // this refer to a function, e.g. String::format
println(add2(1, 9))
println("")
println("Pass functions as arguments to another function")
val greetings = listOf("h", "I", ",", " ", "tHeRE!")
println(doMap(greetings, ::toUpperCase).joinToString("", "Convert to upper case String -> "))
println(doMap(greetings, ::toLowerCase).joinToString("", "Convert to lower case String -> "))
println("")
println("Passing a lambda to the last parameter")
foo("s", false) { x, y -> "sum($x, $y) = ${x + y}" }
println("")
println("Implement a function type as an interface")
print("[Override invoke] ")
val tutorialView1 = { message: String -> println("Init tutorial -> $message") }
tutorialView1.invoke("Page 1")
print("[Run invoke] ")
val tutorialView2 = TutorialView()
tutorialView2.invoke("Page 2")
println("")
println("Invoke")
val join: (String, String) -> String = String::plus
val append: String.(String) -> String = String::plus
println(join("Hello, ", "world!"))
println(join.invoke("Hello, ", "world!"))
println("Hello, ".append("world!"))
val joinInt: Int.(Int) -> String = this::joinIntString
println(joinInt(1, 2))
println(joinInt.invoke(3, 4))
println(5.joinInt(6))
}
private fun getDailyReport(): String {
return "{\"id\":\"csvDailyIncidentReport\", \"name\":\"Daily incidents\"}"
}
private fun sendLog(logs: String?) {
if (logs == null)
throw NullPointerException()
}
private fun <T> handlerError(function: () -> T) {
try {
val result = function()
println(result)
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun sum(a: Int, b: Int) = a + b
private fun <T> doMap(list: List<T>, func: (it: T) -> Any) = list.map { func(it) }
private fun toUpperCase(s: String) = s.map {
if (it.isLetter()) it.toUpperCase() else it
}.joinToString("")
private fun toLowerCase(s: String) = s.map {
if (it.isLetter()) it.toLowerCase() else it
}.joinToString("")
private fun joinIntString(a: Int, b: Int) = "$a$b"
private fun foo(a: String, b: Boolean, c: (x: Int, y: Int) -> String) {
println("a: $a")
println("b: $b")
println(c(23, 84))
}
}
interface OnClickListener {
fun onClick()
}
class JavaButton {
private var onClickListener: OnClickListener? = null
fun setOnClickListener(onClickListener: OnClickListener) {
this.onClickListener = onClickListener
}
fun monkeyTest() {
for (i in 0 until 3) {
onClickListener?.onClick()
}
}
}
class KotlinButton {
private var onClickListener: (() -> Unit)? = null
fun setOnClickListener(onClickListener: () -> Unit) {
this.onClickListener = onClickListener
}
fun monkeyTest() {
for (i in 0 until 3) {
onClickListener?.invoke()
}
}
}
class TutorialView : (String) -> Unit {
override fun invoke(p1: String) {
// This code won't be executed
println("TutorialView: invoke($p1)")
}
}