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
Travelling Across Asia - Our Journey from Java ...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Amal Kakaiya
April 23, 2018
Programming
36
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Travelling Across Asia - Our Journey from Java to Kotlin
Given at Android Makers FR - Paris, 2018
Amal Kakaiya
April 23, 2018
More Decks by Amal Kakaiya
See All by Amal Kakaiya
KotlinConf 18 - Learn together. Not the same.
k4kya
0
520
Other Decks in Programming
See All in Programming
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
630
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.5k
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
スマートグラスで並列バイブコーディング
hyshu
0
260
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
970
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
act1-costs.pdf
sumedhbala
0
120
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
120
Contextとはなにか
chiroruxx
1
380
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
1
460
Featured
See All Featured
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
620
Designing for Performance
lara
611
70k
BBQ
matthewcrist
89
10k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The World Runs on Bad Software
bkeepers
PRO
72
12k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
How to train your dragon (web standard)
notwaldorf
97
6.7k
Balancing Empowerment & Direction
lara
6
1.2k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Chasing Engaging Ingredients in Design
codingconduct
0
230
Transcript
TRAVELLING ACROSS ASIA OUR JOURNEY FROM JAVA TO KOTLIN Amal
Kakaiya @K4KYA @DeliverooEng
None
DISCLAIMER: COULD TAKE MORE THAN 20 HOURS
Java Kotlin AutoValue/Lombok Data classes Streams support Standard lib functions
Retrolambda Built in lambda support Butterknife Kotterknife/delegate properties # TravellingAcrossAsia @K4KYA
ADOPTING A NEW LANGUAGE IS A HUGE STEP # TravellingAcrossAsia
@K4KYA
TESTS ARE AN EASY WAY TO GET STARTED # TravellingAcrossAsia
@K4KYA
TESTS ARE AN EASY WAY TO GET STARTED BUT NOT
VERY EXCITING # TravellingAcrossAsia @K4KYA
HOW MUCH COULD WE IMPROVE THE MAIN APP? # TravellingAcrossAsia
@K4KYA
None
DON’T GO ROGUE! # TravellingAcrossAsia @K4KYA
KOTLIN HOUR THE MEETING YOU ACTUALLY WANT TO GO TO
# TravellingAcrossAsia @K4KYA
YOU CAN’T START USING A LANGUAGE WITHOUT EVERYBODY KNOWING IT
# TravellingAcrossAsia @K4KYA
DO WE REALLY WANT TO ADD ANOTHER DEPENDENCY? # TravellingAcrossAsia
@K4KYA
None
# TravellingAcrossAsia @K4KYA
# TravellingAcrossAsia @K4KYA
FIND YOUR OWN PACE # TravellingAcrossAsia @K4KYA
None
CONVERT ALL THE THINGS!! # TravellingAcrossAsia @K4KYA
IT WASN’T A SMOOTH RIDE # TravellingAcrossAsia @K4KYA
LEARN FROM EACH OTHER # TravellingAcrossAsia @K4KYA
WE REVIEW CODE EVERY DAY # TravellingAcrossAsia @K4KYA
# TravellingAcrossAsia @K4KYA
ANDROID STUDIO IS YOUR FRIEND # TravellingAcrossAsia @K4KYA
private fun mapToIds(items: List<Item>): List<String> { val ids = mutableListOf<String>()
for (item in items) { ids.add(item.id) } return ids } # TravellingAcrossAsia @K4KYA
private fun mapToIds(items: List<Item>): List<String> { val ids = items.map
{ it.id } return ids } # TravellingAcrossAsia @K4KYA
private fun mapToIds(items: List<Item>): List<String> { return items.map { it.id
} } # TravellingAcrossAsia @K4KYA
private fun mapToIds(items: List<Item>): List<String> = items.map { it.id }
# TravellingAcrossAsia @K4KYA
WHAT’S THIS CODE DOING? # TravellingAcrossAsia @K4KYA
private final mapToId(Ljava/util/List;)Ljava/ util/List; L0 LINENUMBER 2 L0 ALOAD 1
CHECKCAST java/lang/Iterable ASTORE 2 ———————— 75 more lines ———————— # TravellingAcrossAsia @K4KYA
private final List mapToId(List items) { Iterable $receiver$iv = (Iterable)items;
Collection destination$iv$iv = (Collection)(new ArrayList(CollectionsKt.collectionSizeOrDefault($receiver$ iv, 10))); Iterator var5 = $receiver$iv.iterator(); while(var5.hasNext()) { Object item$iv$iv = var5.next(); Item it = (Item)item$iv$iv; String var12 = it.id; destination$iv$iv.add(var12); } return (List)destination$iv$iv; } # TravellingAcrossAsia @K4KYA
EXPECT THE UNEXPECTED # TravellingAcrossAsia @K4KYA
val extraOptions = items .map { "Item $it" } .takeIf
{ showExtraOptions } # TravellingAcrossAsia @K4KYA
Iterable $receiver$iv = (Iterable)items; Collection $receiver$iv = (Collection)(new ArrayList(CollectionsKt.collectionSizeOrDefault($receiver$iv, 10)));
Iterator var8 = $receiver$iv.iterator(); while(var8.hasNext()) { Object item$iv$iv = var8.next(); String it = (String)item$iv$iv; String var17 = "Item " + it; $receiver$iv.add(var17); } List var10000 = (List)$receiver$iv; List extraOptions = showExtraOptions ? var10000 : null; # TravellingAcrossAsia @K4KYA
Iterable $receiver$iv = (Iterable)items; Collection $receiver$iv = (Collection)(new ArrayList(CollectionsKt.collectionSizeOrDefault($receiver$iv, 10)));
Iterator var8 = $receiver$iv.iterator(); while(var8.hasNext()) { Object item$iv$iv = var8.next(); String it = (String)item$iv$iv; String var17 = "Item " + it; $receiver$iv.add(var17); } List var10000 = (List)$receiver$iv; List extraOptions = showExtraOptions ? var10000 : null; # TravellingAcrossAsia @K4KYA
val extraOptions = if (showExtraOptions) items .map { "Item $it"
} else null # TravellingAcrossAsia @K4KYA
CONVERTING CODE # TravellingAcrossAsia @K4KYA
CONVERTING CODE # TravellingAcrossAsia @K4KYA
CONVERTING CODE # TravellingAcrossAsia @K4KYA
CONVERTING CODE ⌘⌥⇧K Ctrl+Alt+⇧+K # TravellingAcrossAsia @K4KYA
CONVERTING CODE # TravellingAcrossAsia @K4KYA
CONVERTING CODE # TravellingAcrossAsia @K4KYA
CONVERTING CODE # TravellingAcrossAsia @K4KYA
CONVERSION CREEP # TravellingAcrossAsia @K4KYA
NULLPOINTEREXCEPTION # TravellingAcrossAsia @K4KYA
NULLPOINTEREXCEPTION # TravellingAcrossAsia @K4KYA
KOTLINNULLPOINTEREXCEPTION # TravellingAcrossAsia @K4KYA
CONSIDER NULLABILITY WHEN IMPLEMENTING A JAVA INTERFACE private val passwordActionListener
= TextView.OnEditorActionListener { _: TextView, _: Int, _: KeyEvent -> login(password()) } # TravellingAcrossAsia @K4KYA
CONSIDER NULLABILITY WHEN IMPLEMENTING A JAVA INTERFACE private val passwordActionListener
= TextView.OnEditorActionListener { _: TextView, _: Int, _: KeyEvent -> login(password()) } # TravellingAcrossAsia @K4KYA
CONSIDER NULLABILITY WHEN IMPLEMENTING A JAVA INTERFACE private val passwordActionListener
= TextView.OnEditorActionListener { _: TextView, _: Int, _: KeyEvent -> login(password()) } # TravellingAcrossAsia @K4KYA
CONSIDER NULLABILITY WHEN IMPLEMENTING A JAVA INTERFACE private val passwordActionListener
= TextView.OnEditorActionListener { _: TextView, _: Int, _: KeyEvent -> login(password()) } # TravellingAcrossAsia @K4KYA
CONSIDER NULLABILITY WHEN IMPLEMENTING A JAVA INTERFACE private val passwordActionListener
= TextView.OnEditorActionListener { _: TextView, _: Int, _: KeyEvent? -> login(password()) } # TravellingAcrossAsia @K4KYA
CONSIDER NULLABILITY WHEN IMPLEMENTING A JAVA INTERFACE private val passwordActionListener
= TextView.OnEditorActionListener { _: TextView, _: Int, _: KeyEvent? -> login(password()) } # TravellingAcrossAsia @K4KYA
CONVERTING CODE class VerifyActivity: BaseActivity<VerifyPresenter>, VerifyScreen { override val message:
String = getString(R.string.verify_error) # TravellingAcrossAsia @K4KYA
CONVERTING CODE class VerifyActivity: BaseActivity<VerifyPresenter>, VerifyScreen { override val message:
String get() = getString(R.string.verify_error) # TravellingAcrossAsia @K4KYA
USE VERSION CONTROL EFFECTIVELY # TravellingAcrossAsia @K4KYA
USE VERSION CONTROL EFFECTIVELY AND YOUR TEAM WILL ❤ YOU
# TravellingAcrossAsia @K4KYA
VERSION HISTORY # TravellingAcrossAsia @K4KYA
VERSION CONTROL CONVERSION AS ONE COMMIT # TravellingAcrossAsia @K4KYA
VERSION CONTROL MERGE CONVERSIONS QUICKLY # TravellingAcrossAsia @K4KYA
VERSION CONTROL # TravellingAcrossAsia @K4KYA
VERSION CONTROL SHARE WHAT YOU LEARNED # TravellingAcrossAsia @K4KYA
SHARE WHAT YOU LEARNED VERSION CONTROL # TravellingAcrossAsia @K4KYA
SHARE WHAT YOU LEARNED VERSION CONTROL # TravellingAcrossAsia @K4KYA
VERSION CONTROL LEAVE IN RETURN TYPES WHEN IT MAKES SENSE
# TravellingAcrossAsia @K4KYA
VERSION CONTROL private fun showPrompt(confirmed: Boolean) = zip(flipper().confirmDrinkingAgeEnabled(), just(confirmed) {
enabled, confirmed -> enabled && (!confirmed) } # TravellingAcrossAsia @K4KYA
VERSION CONTROL private fun showPrompt(confirmed: Boolean): Observable<Boolean> = zip(flipper().confirmDrinkingAgeEnabled(), just(confirmed)
{ enabled, confirmed -> enabled && (!confirmed) } # TravellingAcrossAsia @K4KYA
# TravellingAcrossAsia @K4KYA
ANDROIDANNOTATIONS AUTOVALUE BUTTERKNIFE LOMBOK DAGGER CUSTOM ANNOTATION PROCESSOR # TravellingAcrossAsia
@K4KYA
KAPT KAY - AY - PEE - TEE # TravellingAcrossAsia
@K4KYA
KAPT VS LOMBOK A TRUE STORY # TravellingAcrossAsia @K4KYA
KAPT VS LOMBOK A TRUE STORY # TravellingAcrossAsia @K4KYA
WHAT WOULD WE CHANGE? # TravellingAcrossAsia @K4KYA
CONVERT UTIL CLASSES EARLY # TravellingAcrossAsia @K4KYA
@file:JvmName(“ViewUtils") @JvmName("showView") fun View.show(visible: Boolean) { visibility = if (visible)
VISIBLE else GONE } # TravellingAcrossAsia @K4KYA
DO WHAT WORKS FOR YOUR TEAM # TravellingAcrossAsia @K4KYA
None
THANK YOU WE’RE HIRING Amal Kakaiya @K4KYA