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
Roberto Orgiu
July 04, 2017
Technology
0
120
Kotlin and why you should love it #2
Slides of the talk we gave in Ennova
Roberto Orgiu
July 04, 2017
Tweet
Share
More Decks by Roberto Orgiu
See All by Roberto Orgiu
Wellness & Droid
tiwiz
0
120
Behind the curtains
tiwiz
0
66
The Importance of Being Tested
tiwiz
0
420
An Android Dev start to Kotlin MPP
tiwiz
0
180
Fantastic API and where to find them
tiwiz
0
76
Flipping the Koin @ GDG Dev Party
tiwiz
1
74
Flipping the Koin
tiwiz
2
160
Trip into the async world @ NYC Kotlin Meetup
tiwiz
0
120
Trip into the async world
tiwiz
1
140
Other Decks in Technology
See All in Technology
モブプログラミング再入門 ー 基本から見直す、AI時代のチーム開発の選択肢 ー / A Re-introduction of Mob Programming
takaking22
5
1.2k
僕、S3 シンプルって名前だけど全然シンプルじゃありません よろしくお願いします
yama3133
1
170
GitLab Duo Agent Platform + Local LLMサービングで幸せになりたい
jyoshise
0
250
Kubernetesにおける推論基盤
ry
1
260
EMからICへ、二周目人材としてAI全振りのプロダクト開発で見つけた武器
yug1224
5
510
Claude Code 2026年 最新アップデート
oikon48
6
1.2k
Claude Codeの進化と各機能の活かし方
oikon48
21
11k
SaaSからAIへの過渡期の中で現在、組織内で起こっている変化 / SaaS to AI Paradigm Shift
aeonpeople
0
120
JAWS DAYS 2026 ExaWizards_20260307
exawizards
0
390
AIエージェント時代に備える AWS Organizations とアカウント設計
kossykinto
3
650
OpenClawで回す組織運営
jacopen
3
670
事例に見るスマートファクトリーへの道筋〜工場データをAI Readyにする実践ステップ〜
hamadakoji
1
270
Featured
See All Featured
Leo the Paperboy
mayatellez
4
1.5k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
99
The Curse of the Amulet
leimatthew05
1
9.8k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
61
52k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
380
Into the Great Unknown - MozCon
thekraken
40
2.3k
First, design no harm
axbom
PRO
2
1.1k
30 Presentation Tips
portentint
PRO
1
250
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
250
The Invisible Side of Design
smashingmag
302
51k
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!