Kotlin高階函數(shù)reduce與fold使用實例
在 Kotlin 中,reduce() 和 fold() 是函數(shù)式編程中常用的高階函數(shù)。它們都是對集合中的元素進行聚合操作的函數(shù),將一個集合中的元素縮減成一個單獨的值。它們的使用方式非常相似,但是返回值略有不同。下面是它們的區(qū)別:
reduce()函數(shù)是對集合中的所有元素進行聚合處理,并返回最后一個合并處理值。fold()函數(shù)除了合并所有元素之外,還可以接受一個初始值,并將其與聚合結(jié)果一起返回。注:如果集合為空的話,只會返回初始值。
reduce示例
1、使用 reduce() 函數(shù)計算列表中所有數(shù)字的總和:
fun reduceAdd() {
val list = listOf(1, 2, 3, 4, 5)
val sum = list.reduce { acc, i ->
println("acc:$acc, i:$i")
acc + i
}
println("sum is $sum") // 15
}
執(zhí)行結(jié)果:
acc:1, i:2
acc:3, i:3
acc:6, i:4
acc:10, i:5
sum is 15
2、使用 reduce() 函數(shù)計算字符串列表中所有字符串的拼接結(jié)果:
val strings = listOf("apple", "banana", "orange", "pear")
val result = strings.reduce { acc, s -> "$acc, $s" }
println(result) // apple, banana, orange, pear
執(zhí)行結(jié)果:
apple, banana, orange, pear
fold示例
1、使用 fold() 函數(shù)計算列表中所有數(shù)字的總和,并在其基礎上加上一個初始值:
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.fold(10) { acc, i -> acc + i }
println(sum) // 25
執(zhí)行結(jié)果為:
acc:10, i:1
acc:11, i:2
acc:13, i:3
acc:16, i:4
acc:20, i:5
sum is 25
2、使用 fold() 函數(shù)將列表中的所有字符串連接起來,并在其基礎上加上一個初始值:
val strings = listOf("apple", "banana", "orange", "pear")
val result = strings.fold("Fruits:") { acc, s -> "$acc $s" }
println(result) // Fruits: apple banana orange pear
執(zhí)行結(jié)果:
Fruits: apple banana orange pear
源碼解析
reduce() 在Kotlin標準庫的實現(xiàn)如下:
public inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S {
val iterator = this.iterator()
if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.")
var accumulator: S = iterator.next()
while (iterator.hasNext()) {
accumulator = operation(accumulator, iterator.next())
}
return accumulator
}
從代碼中可以看出,reduce函數(shù)接收一個operation參數(shù),它是一個lambda表達式,用于聚合計算。reduce函數(shù)首先獲取集合的迭代器,并判斷集合是否為空,若為空則拋出異常。然后通過迭代器對集合中的每個元素進行遍歷操作,對元素進行聚合計算,將計算結(jié)果作為累加器,傳遞給下一個元素,直至聚合所有元素。最后返回聚合計算的結(jié)果。
fold() 在Kotlin標準庫的實現(xiàn)如下:
public inline fun <T, R> Iterable<T>.fold(
initial: R,
operation: (acc: R, T) -> R
): R {
var accumulator: R = initial
for (element in this) {
accumulator = operation(accumulator, element)
}
return accumulator
}
從代碼中可以看出,fold函數(shù)接收兩個參數(shù),initial參數(shù)是累加器的初始值,operation參數(shù)是一個lambda表達式,用于聚合計算。
fold函數(shù)首先將初始值賦值給累加器,然后對集合中的每個元素進行遍歷操作,對元素進行聚合計算,將計算結(jié)果作為累加器,傳遞給下一個元素,直至聚合所有元素。最后返回聚合計算的結(jié)果。
總結(jié)
reduce()適用于不需要初始值的聚合操作,fold()適用于需要初始值的聚合操作。reduce()操作可以直接返回聚合后的結(jié)果,而fold()操作需要通過lambda表達式的返回值來更新累加器的值。
在使用時,需要根據(jù)具體場景來選擇使用哪個函數(shù)。
到此這篇關于Kotlin高階函數(shù)reduce與fold使用實例的文章就介紹到這了,更多相關Kotlin reduce與fold內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
android studio 打包自動生成版本號與日期,apk輸入路徑詳解
這篇文章主要介紹了android studio 打包自動生成版本號與日期,apk輸入路徑詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android高手進階教程(二十二)之Android中幾種圖像特效處理的集錦匯總!!
本篇文章主要介紹了Android中幾種圖像特效處理,比如圓角,倒影,還有就是圖片縮放,Drawable轉(zhuǎn)化為Bitmap,Bitmap轉(zhuǎn)化為Drawable等,有需要的可以了解一下。2016-11-11
android視頻播放簡單實現(xiàn)示例(VideoView&MediaPlayer)
本篇文章主要介紹了android視頻播放簡單實現(xiàn)示例(VideoView&MediaPlayer),具有一定的參考價值,有興趣的可以了解一下2017-08-08
Android中TextView和ImageView實現(xiàn)傾斜效果
這篇文章主要為大家詳細介紹了Android中TextView和ImageView實現(xiàn)傾斜效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

