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
Amal Kakaiya
April 23, 2018
Programming
0
33
Travelling Across Asia - Our Journey from Java to Kotlin
Given at Android Makers FR - Paris, 2018
Amal Kakaiya
April 23, 2018
Tweet
Share
More Decks by Amal Kakaiya
See All by Amal Kakaiya
KotlinConf 18 - Learn together. Not the same.
k4kya
0
510
Other Decks in Programming
See All in Programming
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
100
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
170
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
1.2k
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
2.2k
Oxlintはいいぞ
yug1224
2
170
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
830
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
380
AI Agent Dojo #4: watsonx Orchestrate ADK体験
oniak3ibm
PRO
0
130
AIエージェントの設計で注意するべきポイント6選
har1101
6
3.2k
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
5.7k
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
3
810
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.6k
Featured
See All Featured
Thoughts on Productivity
jonyablonski
74
5k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
250
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.6k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Raft: Consensus for Rubyists
vanstee
141
7.3k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Skip the Path - Find Your Career Trail
mkilby
0
44
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
390
Joys of Absence: A Defence of Solitary Play
codingconduct
1
270
Statistics for Hackers
jakevdp
799
230k
Side Projects
sachag
455
43k
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