<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 別樣的求和方式:sumBy、sum、fold、reduce 在**開發中,對集合進行求和操作是十分常見的操作**。比如我們要得到該列表中學生的平均分就需要先計算出所有學生的總分。 ``` var scoreTotal = 0 for (item in students) { scoreTotal = scoreTotal + item.score } ``` 上面就是我們常用的一種求和方式。在Kotlin中,我們可以這樣去做: ``` val scoreTotal = students.sumBy {it.score} ``` 我們調用了Kotlin集合中的sumBy方法實現了求和,省去了一些多余的步驟。其實在Kotlin的集合中還有許多求和的API,接下來我們就來了解一下。 #### 1. sum:對數值類型的列表進行求和 sum與sumBy類似,也是一個比較常見的求和API,但是它**只能對一些數值類型的列表進行求和**。比如: ``` val a = listOf(1, 2, 3, 4, 5) val b = listOf(1.1, 2.5, 3.0, 4.5) val aTotal = a.sum() val bTotal = b.sum() ``` 上面的**兩個數值類型的列表就可以通過sum進行求和**。當然我們同樣也可以使用sumBy: ``` val aTotal = a.sumBy {it} val bTotal = b.sumBy {it} ``` #### 2. fold fold方法是一個非常強大的API,我們先來看看實現它的源碼: ~~~ public inline fun <T, R> Iterable<T>.fold(initial: R, operation: (acc: R, T) -> R): R { var accumulator = initial for (element in this) accumulator = operation(accumulator, element) return accumulator } ~~~ 可以看到,fold方法需要接收兩個參數,第1個參數initial通常稱為初始值,第2個參數operation是一個函數。**在實現的時候,通過for語句來遍歷集合中的每個元素,每次都會調用operation函數,而該函數的參數有兩個,一個是上一次調用該函數的結果(如果是第一次調用,則傳入初始值initial),另外一個則是當前遍歷到的集合元素。簡單來說就是:每次都調用operation函數,然后將產生的結果作為參數提供給下一次調用**。 那我們先來使用一下這個方法(緊接著filter函數章節的person數據類): ~~~ val scoreTotal = persons.fold(0) { accumulator, person -> accumulator + person.score } println("所有人的總分:$scoreTotal") ~~~ 輸出結果 ``` 所有人的總分:447 ``` 通過上面的方式我們同樣也能得到所有學生的總分。在上面的代碼中,**fold方法接收一個初始值0,然后接收了一個函數,也就是后面的Lambda表達式**。 ``` { accumulator, person -> accumulator + person.score } ``` 上面的函數有兩個參數,第1個參數為每次執行該函數后的返回結果,第2個參數為學生列表中的某個元素。我們通過讓前一次執行之后的結果與當前遍歷的學生的分數相加,就實現了求和的操作。簡單說來,上面的方法的效果等價于下面的操作: ``` var accumulator = 0 for (person in persons) accumulator = accumulator + person.score ``` 其實就是一個簡單的累加操作。同樣我們還可以實現集合對第1個到最后一個元素的操作結果進行累乘: ~~~ val list = listOf(1, 2, 3, 4, 5) val total = list.fold(1) { mul, item -> mul * item } println(total)//120 ~~~ **fold很好地利用了遞歸的思想**。除了以上簡單的操作之外,其實它還有非常強大的作用。在本書的第10章中我們會用fold結合函數式數據結構來展示這一特點。 #### 3. reduce reduce方法和fold非常相似,**唯一的區別就是reduce方法沒有初始值**。我們同樣來看看reduce方法的源碼: ~~~ 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方法只接收一個參數,該參數為一個函數。具體的實現方式也與fold類似,不同的是當要遍歷的集合為空時,會拋出一個異常。因為沒有初始值,所以默認的初始值是集合中的第1個元素。采用reduce方法同樣能實現上面的求和操作(緊接著filter函數章節的person數據類): ~~~ val scoreTotal = persons.reduce {accumulator, person -> accumulator + person.score}//這里有問題 ~~~ **reduce方法和fold方法相似,當我們不需要初始值的時候可以采用reduce方法**。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看