致⼒於⽤更簡潔、⾼語意的程式碼來操作資料
otlin Collection 遊樂園
范聖佑 (Shengyou Fan)
JetBrains Developer Advocate
COSCUP 2022
2022/07/30
Photo by Clay Banks on Unsplash
Kotlin 程式語⾔
—
https://kotlinlang.org/
• General-purpose
• Static typing
• ⽀援 OOP 及 FP 語法
• 由 JetBrains 團隊研發
• 以 Apache 2.0 開源釋出
2017 2019
Kotlin 發展史
—
2011
JetBrains 公開
Kotlin 語⾔
2016
正式發佈
Kotlin 1.0
Google I/O宣佈
⽀援以 Kotlin
開發 Android
Google I/O宣佈
Android 開發將
以 Kotlin 優先
2020
Kotlin 團隊改
以 Date-driven
發佈新版本
2022
發佈 Kotlin 1.7
Kotlin 多平台開發
—
Desktop
Kotlin/JVM
Server
Kotlin/JVM
Android
Kotlin/JVM
iOS
Kotlin/Native
Web
Kotlin/JS
• Serialization
• Coroutine
• Datetime
• Ktor
Kotlin 多平台⽣態系
—
標準函式庫裡的 Collection Package
—
package kotlin.collections
Collection 是什麼?
—
• 拿來存放資料的結構
• 標準函式庫共設計了四種類別供使⽤
• 類別提供了各種操作資料的⽅法
• 串接使⽤更具威⼒
Collection 四⼤物件
—
Array List Set Map
無法變更尺⼨
以 Index 排序
元素可重複
分可變及不可變
以 Index 排序
元素可重複
分可變及不可變
元素間沒有順序
元素不可重複
分可變及不可變
Key 不可重複
Value 可重複
元素間沒有順序
開啟專屬遊樂園
—
線上遊樂園
—
當⼿邊沒有 IDE 時…
play.kotlinlang.org
宣告 Collection
—
collectionOf(elements)
依類別使⽤對應 Top-Level 函式
依需求放入不定量元素
⾃動推斷型別
宣告語法
—
arrayOf(1, 2, 3, 3, 5).contentToString()
!" [1, 2, 3, 3, 5]
Array
List
Set
Map
listOf(1, 2, 3, 3, 5)
!" [1, 2, 3, 3, 5]
setOf("Sam", "Mary", "Mary", "John", "Tom")
!" [Sam, Mary, John, Tom]
mapOf(
"Apple" to 7,
"Banana" to 5,
"Orange" to 7,
)
{Apple=7, Banana=5, Orange=7}
使⽤ Collection Methods
—
collection.method()
標準函式庫提供豐富的⽅法
IDE 會⾃動依據類別提⽰⽅法名
注意操作⽅式及回傳值
map()
—
listOf(!, ", #, $).map {
}
map()
—
listOf(!, ", #, $).map {
cook(it)
}
map()
—
listOf(!, ", #, $).map {
cook(it)
}
!" [%, &, ', (]
map()
—
listOf(1, 2, 3).map {
"map$it"
}
!" [map1, map2, map3]
filter()
—
listOf(%, &, ', ().filter {
}
filter()
—
listOf(%, &, ', ().filter {
it.isSuitableForVegatarian
}
filter()
—
listOf(%, &, ', ().filter {
it.isSuitableForVegatarian
}
!" [&, (]
filter()
—
listOf(
"Grape",
"Papaya",
"Pineapple",
"Pear"
).filter {
it.startsWith("P")
}
!" [Papaya, Pineapple, Pear]
reduce()
—
listOf(%, &, ', ().reduce {
}
reduce()
—
listOf(%, &, ', ().reduce {
!" eat!!#
}
reduce()
—
listOf(%, &, ', ().reduce {
!" eat!!#
}
!" )
reduce()
—
listOf(1, 2, 3).reduce { acc, e !"
acc + e
}
!" acc=1, e=2, 1+2=3
reduce()
—
listOf(1, 2, 3).reduce { acc, e !"
acc + e
}
!" acc=1, e=2, 1+2=3
!" acc=3, e=3, 3+3=6
⽜⼑⼩試
—
早安 * 今天新加坡樂透的頭獎⾦額⾼達
$8,600,000(約新台幣 1.8 億)耶!快給
我 1 組 6 個 1 到 49 之間的不重複數字,
我要去買個機會,假如明天我沒來上班
的話,你就知道發⽣什麼事了 +
,
產⽣ 1..49 數列
—
(1!$49)
以 Range 產⽣數列
隨機排序
—
(1!$49).shuffled()
回傳新的集合物件
取出 6 個數字
—
(1!$49).shuffled()
.take(6)
回傳新的集合物件
由數值⼤⼩排序
—
(1!$49).shuffled()
.take(6)
.sorted()
回傳新的集合物件
組合成字串
—
(1!$49).shuffled()
.take(6)
.sorted()
.joinToString()
回傳合併後的字串
輸出字串
—
(1!$49).shuffled()
.take(6)
.sorted()
.joinToString()
.let(!%println)
合併 Scope Function
輸出字串結果
寫法比較
—
val numbers = mutableSetOf<Int>()
while (numbers.size < 6) {
numbers.add(
Random.nextInt(1, 49)
)
}
println(numbers.sorted())
(1!$49).shuffled()
.take(6)
.sorted()
.joinToString()
.let(!%println)
再試⾝⼿
—
能更視覺化呈現嗎?
,
先放⼀顆球
—
@Composable
fun LotteryBoard() {
Column(
!!#
) {
Row {
Ball(!!#)
}
}
}
}
產⽣ 1..49 數列
—
@Composable
fun LotteryBoard() {
Column(
!!#
) {
(1!$49)
Row {
Ball(!!#)
}
}
}
}
7 個數字分⼀群
—
@Composable
fun LotteryBoard() {
Column(
!!#
) {
(1!$49).chunked(7)
Row {
Ball(!!#)
}
}
}
}
先繪製 7 列
—
@Composable
fun LotteryBoard() {
Column(
!!#
) {
(1!$49).chunked(7).forEach { group !"
Row {
Ball(!!#)
}
}
}
}
再繪製列內的元素
—
@Composable
fun LotteryBoard() {
Column(
!!#
) {
(1!$49).chunked(7).forEach { group !"
Row {
group.forEach {
Ball(it)
}
}
}
}
}
寫法比較
—
@Composable
fun LotteryBoard() {
Column(
!!#
) {
for (i in 0!$6) {
Row {
for (j in 1!$7) {
Ball(i*7+j)
}
}
}
}
}
@Composable
fun LotteryBoard() {
Column(
!!#
) {
(1!$49).chunked(7).forEach { group !"
Row {
group.forEach {
Ball(it)
}
}
}
}
}
• 從其他類別轉成集合
• 逐⾏印出檔案內容
• 簡易統計運算
• 與 Web 框架整合實作 Mock Server
更多應⽤案例
—
Collection Methods
—
-
⾼達 200+ 個 Method
9 ⼤分類
—
速查地圖
—
Kotlin Collection 全⽅位解析攻略
—
collection.kotlin.tips
挑戰題
—
機會難得,我想多下三注,這三組號碼不想重疊,
但其中⼀定要有我老婆、⼩孩的⽣⽇:12/31、8/
29、7/9。另外, 13 和 5 這兩個號碼和我不合,⽽
17 和 44 在不同⽂化裡代表著不吉利我也想避開,
你能幫我修改⼀下程式嗎? :)
,
• 不需要⽤ for 迴圈
• 程式碼變得很簡潔、易讀性變⾼
• 操作資料變得很簡單,可以拆成⼀⼩步⼀⼩步完成
• 可以跟其他語⾔特性綜合使⽤
回顧 - 學習 Collection 的好處?
—
歡迎參加 Kotlin 社群
—
Line 群 Telegram 群
加入討論群取得最新資訊
tw.kotlin.tips
關注粉絲⾴及頻道
—
Coding 職⼈塾
Kraftsman
范聖佑 (Shengyou Fan)
shengyou.fan@jetbrains.com
Q&A
—
Kotlin Collection 遊樂園

[COSCUP 2022] Kotlin Collection 遊樂園