Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin and why you should love it #2
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Roberto Orgiu
July 04, 2017
Technology
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlin and why you should love it #2
Slides of the talk we gave in Ennova
Roberto Orgiu
July 04, 2017
More Decks by Roberto Orgiu
See All by Roberto Orgiu
Wellness & Droid
tiwiz
0
140
Behind the curtains
tiwiz
0
89
The Importance of Being Tested
tiwiz
0
450
An Android Dev start to Kotlin MPP
tiwiz
0
210
Fantastic API and where to find them
tiwiz
0
100
Flipping the Koin @ GDG Dev Party
tiwiz
1
79
Flipping the Koin
tiwiz
2
180
Trip into the async world @ NYC Kotlin Meetup
tiwiz
0
130
Trip into the async world
tiwiz
1
150
Other Decks in Technology
See All in Technology
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.2k
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
210
ホームラボ紹介
y_sera15
0
160
強化学習「理論」入門
enakai00
3
3.6k
Flutterをカメラで動かしたかった話
sony
1
140
MIRU 2026 チュートリアル
keisuke198619
0
910
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
800
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
320
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.3k
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
200
第3回しろおびセキュリティスポンサーセッション
log0417
0
180
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
Featured
See All Featured
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
My Coaching Mixtape
mlcsv
0
220
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
WENDY [Excerpt]
tessaabrams
11
39k
Being A Developer After 40
akosma
91
590k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Transcript
KOTLIN AND WHY YOU SHOULD LOVE IT Part 2
LAMBDAS WITH RECEIVERS The ability to call methods of a
different object in the body of a lambda without any additional qualifiers — Kotlin in Action
with fun alphabet(): String { val result = StringBuilder() for
(letter in 'A'..'Z') { result.append(letter) } result.append("\nNow I know the alphabet!") return result.toString() }
with fun alphabet(): String { val stringBuilder = StringBuilder() return
with(stringBuilder) { for (letter in 'A'..'Z') { this.append(letter) } append("\nNow I know the alphabet!") this.toString() } }
with fun alphabet() = with(StringBuilder()) { for (letter in 'A'..'Z')
{ append(letter) } append("\nNow I know the alphabet!") toString() }
apply fun alphabet() = StringBuilder().apply { for (letter in 'A'..'Z')
{ append(letter) } append("\nNow I know the alphabet!") }.toString()
with VS apply Declaration Return type with Function value of
the lambda apply Extension method this
with VS apply inline fun <T, R> with(receiver: T, block:
T.() -> R): R = receiver.block() inline fun <T> T.apply(block: T.() -> Unit): T { block() return this }
let VS run inline fun <T, R> T.run(block: T.() ->
R): R = block() inline fun <T, R> T.let(block: (T) -> R): R = block(this)
DESTRUCTURING DECLARATION val mickey = Person("Mickey", "Mouse") val (name, lastName)
= mickey
DESTRUCTURING DECLARATION val mickey = Person("Mickey", "Mouse") val (name, lastName)
= mickey MEANS val name = mickey.component1() val lastName = mickey.component2()
LOCAL FUNCTIONS Functions can be nested inside a containing function
And they have access to all parameters and variables of the enclosing function
LOCAL FUNCTIONS fun containing(a : Int) { fun nested() {
return a + 2 } val b = nested() }
SEALED CLASSES sealed class Expr data class Const(val number: Double)
: Expr() data class Sum(val e1: Expr, val e2: Expr) : Expr() object NotANumber : Expr()
SEALED CLASSES fun eval(expr: Expr): Double = when(expr) { is
Const -> expr.number is Sum -> eval(expr.e1) + eval(expr.e2) NotANumber -> Double.NaN }
SINGLETON AKA object DECLARATIONS
object DataProviderManager { fun register(provider: Provider) { // ... }
}
THIS IS NOT THE ONLY USE OF object
object EXPRESSIONS textView.addTextChangedListener(object : TextWatcher{ override fun afterTextChanged(...) {} override
fun beforeTextChanged(...) {} override fun onTextChanged(...) {} })
COMPANION object class MyClass { companion object Factory { fun
create(): MyClass = MyClass() } } val instance = MyClass.create()
COMPANION object class MyClass { companion object { } }
val x = MyClass.Companion
object init > object declarations are initialized lazily, when accessed
for the first time > object expressions are executed (and initialized) immediately, where they are used > a companion object is initialized when the corresponding class is loaded (resolved), matching the semantics of a Java static initializer
DELEGATION
interface Base { fun print() } class BaseImpl(val x: Int)
: Base { override fun print() { print(x) } }
val b = BaseImpl(10)
class Derived(b: Base) : Base by b
val b = BaseImpl(10) Derived(b).print() This prints 10
class Derived(b: Base) : Base by b { override fun
print() { print("abc") } }
val b = BaseImpl(10) Derived(b).print() This prints abc
STANDARD DELEGATES
lazy - THIS... val lazyValue: String by lazy { println("computed!")
"Hello" } println(lazyValue) println(lazyValue)
lazy - ... WILL PRINT computed! Hello Hello
Delegates.observable() - THIS ... class User { var name: String
by Delegates.observable("<no name>") { prop, old, new -> println("$old -> $new") } } fun main(args: Array<String>) { val user = User() user.name = "first" user.name = "second" }
Delegates.observable() - ... WILL PRINT <no name> -> first first
-> second
THE HANDLER WILL BE CALLED AFTER THE VALUE HAS BEEN
SET
Delegates.vetoable()
map DELEGATE class User(map: Map<String, Any?>) { val name: String
by map val age: Int by map } val user = User(mapOf( "name" to "John Doe", "age" to 25 ))
COLLECTIONS: MUTABLE VS IMMUTABLE val list = listOf(1, 2, 3)
//immutable list of ints val list = mutableListOf(1, 2, 3) //mutable list of ints
COLLECTIONS: MUTABLE VS IMMUTABLE > Mutable: you can insert, update
and remove > Default: you can only query (contains, get, indexOf...) > MutableList / List > MutableSet / Set > MutableMap / Map
COLLECTIONS: IMMUTABILITY val list = listOf(1, 2, 3) val doubles
= list.map { it * 2 } val pairs = list.filter { it % 2 == 0 } > doubles is a completely new list > The original list is never touched
COLLECTIONS: OPERATIONS > filter > map > any, none, all
> firstOrNull
More info at https://kotlinlang.org/docs/reference/ delegated-properties.html
SLIDES bit.ly/ennova
THANKS!