iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Kotlin

讓 Kotlin 程式碼更道地 - 談 Effective Kotlin 與相關的 Design Pattern系列 第 28

D28: Kotlin 集合的效率 - 利用複合高階函式減少操作

  • 分享至 

  • xImage
  •  

Item 54: Limit the number of operations
這個要點,要直翻比較沒這麼傳神,為好懂一點,改成這個標題

利用複合高階函式減少操作

每一個集合處理方法都是一個成本。對於標準的集合處理,其成本包括:

  • 對元素的額外迴圈
  • 在底層建立新的集合

對於序列 (Sequence) 處理,其成本是

  • 有額外的物件包裏整個 Sequence 時
  • 建立 Lambda 表達式時

這些成本通常都很小,但它們與元素數量成正比。所以,對於大型集合,這樣的成本可能變得很明顯。限制這些成本的最基本方法之一是使用複合的操作。例如,不是先過濾非空值再轉換為非空值型別,我們使用 filterNotNull。或者,不是map 轉換後過濾出空值,我們可以直接使用 mapNotNull。

示例

// Works
fun List<User>.getNames(): List<String> =
 this.map { it.name }
 .filter { it * null }
 .map { it }
// Better
fun List<User>.getNames(): List<String> =
 this.map { it.name }
 .filterNotNull()
// Best
fun List<User>.getNames(): List<String> =
 this.mapNotNull { it.name }

IDE 會提醒你

最大的問題不是誤解這些改變的重要性,而是我們缺乏知識,不知道應該使用哪些高階集合處理函式。這也是為什麼學習它們是有益的另一個原因。此外,IntelliJ 或是 Android Studio 的警告也會提供幫助,它們經常建議更好的替代方法

https://ithelp.ithome.com.tw/upload/images/20231009/20135701OnNEVIsKLN.png

背下這張表

不過,這些建議還是有限,可以透過記憶或印象回來看這張表。以下是一些常見的函式呼叫及限制操作數量的替代方法列表

可優化對象 建議使用
.filter { it != null }.map { it!! } .filterNotNull().map { it!! }
.map { <Transformation> }.filterNotNull () mapNotNull { ‹Transformation> }
.map { <Transformation> }.joinToString() .joinToString { <Transformation> }
.filter { ‹Predicate 1> }.filter { <Predicate 2> } .filter { <Predicate 1> && <Predicate 2> }
.filter { it is Type }.map { it as Type } .filterIsInstance<Type>()
.sortedBy { <Key 2> }.sortedBy { <Key 1> } .sortedWith (compareBy { <Key 1> }, { <Key 2> 1))
.listOf (...).filterNotNull () .listOfNotNull (...)
withIndex().filter { (index, elem) -> <Predicate using index> }.map { it.value} .filterIndexed { index, elem -> <Predicate using index> } (Similarly for map, forEach, reduce and fold)

https://ithelp.ithome.com.tw/upload/images/20231009/20135701fALxPFUEwk.png

小結

大多數的集合處理步驟需要對整個集合進行迭代和中間集合的建立。這個成本可以通過使用更合適的集合處理高階函式來減少。

每日一推(G)-IDLE

年初(G)-IDLE有來台灣的紅白。高人氣!!

Yes


上一篇
D27: 偏好使⽤ Sequences 來取代大量且有多次操作的集合
下一篇
D29: 內建在 Kotlin 的委託模式 - Delegation Pattern
系列文
讓 Kotlin 程式碼更道地 - 談 Effective Kotlin 與相關的 Design Pattern30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言