欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin高階函數(shù)reduce與fold使用實例

 更新時間:2023年04月24日 09:57:56   作者:-小馬快跑-  
Kotlin的高階函數(shù)reduce和fold可以用來對集合進(jìn)行聚合操作。reduce函數(shù)將集合元素逐個累加,而fold函數(shù)則可以指定一個初始值進(jìn)行累加。這兩個函數(shù)在處理大數(shù)據(jù)集時非常有用

Kotlin 中,reduce()fold() 是函數(shù)式編程中常用的高階函數(shù)。它們都是對集合中的元素進(jìn)行聚合操作的函數(shù),將一個集合中的元素縮減成一個單獨的值。它們的使用方式非常相似,但是返回值略有不同。下面是它們的區(qū)別:

  • reduce() 函數(shù)是對集合中的所有元素進(jìn)行聚合處理,并返回最后一個合并處理值。
  • 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ù)字的總和,并在其基礎(chǔ)上加上一個初始值:

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ù)將列表中的所有字符串連接起來,并在其基礎(chǔ)上加上一個初始值:

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標(biāo)準(zhǔn)庫的實現(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表達(dá)式,用于聚合計算。reduce函數(shù)首先獲取集合的迭代器,并判斷集合是否為空,若為空則拋出異常。然后通過迭代器對集合中的每個元素進(jìn)行遍歷操作,對元素進(jìn)行聚合計算,將計算結(jié)果作為累加器,傳遞給下一個元素,直至聚合所有元素。最后返回聚合計算的結(jié)果。

fold()Kotlin標(biāo)準(zhǔn)庫的實現(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表達(dá)式,用于聚合計算。

fold函數(shù)首先將初始值賦值給累加器,然后對集合中的每個元素進(jìn)行遍歷操作,對元素進(jìn)行聚合計算,將計算結(jié)果作為累加器,傳遞給下一個元素,直至聚合所有元素。最后返回聚合計算的結(jié)果。

總結(jié)

  • reduce()適用于不需要初始值的聚合操作,fold()適用于需要初始值的聚合操作。
  • reduce()操作可以直接返回聚合后的結(jié)果,而fold()操作需要通過lambda表達(dá)式的返回值來更新累加器的值。

在使用時,需要根據(jù)具體場景來選擇使用哪個函數(shù)。

到此這篇關(guān)于Kotlin高階函數(shù)reduce與fold使用實例的文章就介紹到這了,更多相關(guān)Kotlin reduce與fold內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android編程實現(xiàn)簡單流量管理功能實例

    Android編程實現(xiàn)簡單流量管理功能實例

    這篇文章主要介紹了Android編程實現(xiàn)簡單流量管理功能的方法,結(jié)合實例形式分析了Android實現(xiàn)流量監(jiān)控所涉及的功能模塊與布局技巧,需要的朋友可以參考下
    2016-02-02
  • Flutter使用RepositoryProvider解決跨組件傳值問題

    Flutter使用RepositoryProvider解決跨組件傳值問題

    在實際開發(fā)過程中,經(jīng)常會遇到父子組件傳值的情況。本文將利用RepositoryProvider解決跨組件傳值的問題,感興趣的小伙伴可以了解一下
    2022-04-04
  • Android開發(fā)基礎(chǔ)實現(xiàn)最簡單的視頻播放示例

    Android開發(fā)基礎(chǔ)實現(xiàn)最簡單的視頻播放示例

    這篇文章主要為大家介紹了Android開發(fā)基礎(chǔ)實現(xiàn)最簡單的視頻播放示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Android跳轉(zhuǎn)系統(tǒng)設(shè)置Settings的各個界面詳解

    Android跳轉(zhuǎn)系統(tǒng)設(shè)置Settings的各個界面詳解

    系統(tǒng)設(shè)置Settings中定義的一些常用的各界面ACTION常量,下面這篇文章主要給大家介紹了關(guān)于Android跳轉(zhuǎn)系統(tǒng)設(shè)置Settings的各個界面,文中介紹非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Android利用Intent.ACTION_SEND進(jìn)行分享

    Android利用Intent.ACTION_SEND進(jìn)行分享

    這篇文章主要介紹了Android利用Intent.ACTION_SEND進(jìn)行分享,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android在高jar包版本的工程中修改方法

    Android在高jar包版本的工程中修改方法

    android的應(yīng)用程序安裝包APK如果是在高版本的android jar上開發(fā)的是無法在低版本的android SDK上跑的,那么如何簡單的在高版本的工程中直接修改呢,需要的朋友可以了解下
    2012-12-12
  • 在Kotlin開發(fā)中如何使用集合詳解

    在Kotlin開發(fā)中如何使用集合詳解

    這篇文章主要給大家介紹了關(guān)于在Kotlin開發(fā)中如何使用集合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Android實現(xiàn)SwipeRefreshLayout首次進(jìn)入自動刷新

    Android實現(xiàn)SwipeRefreshLayout首次進(jìn)入自動刷新

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)SwipeRefreshLayout首次進(jìn)入自動刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Emoji表情在Android JNI中的兼容性問題詳解

    Emoji表情在Android JNI中的兼容性問題詳解

    這篇文章主要給大家介紹了關(guān)于Emoji表情在Android JNI中的兼容性問題,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Android JNI具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Android開發(fā)學(xué)習(xí)筆記 Gallery和GridView淺析

    Android開發(fā)學(xué)習(xí)筆記 Gallery和GridView淺析

    這篇文章主要介紹了Android開發(fā)學(xué)習(xí)筆記 Gallery和GridView淺析,需要的朋友可以參考下
    2014-11-11

最新評論