fold所在位置是kotlin.collections.fold,其相關用法介紹如下。

用法一

inline fun <T, R> Array<out T>.fold(
    initial: R, 
    operation: (acc: R, T) -> R
): R
inline fun <R> ByteArray.fold(
    initial: R, 
    operation: (acc: R, Byte) -> R
): R
inline fun <R> ShortArray.fold(
    initial: R, 
    operation: (acc: R, Short) -> R
): R
inline fun <R> IntArray.fold(
    initial: R, 
    operation: (acc: R, Int) -> R
): R
inline fun <R> LongArray.fold(
    initial: R, 
    operation: (acc: R, Long) -> R
): R
inline fun <R> FloatArray.fold(
    initial: R, 
    operation: (acc: R, Float) -> R
): R
inline fun <R> DoubleArray.fold(
    initial: R, 
    operation: (acc: R, Double) -> R
): R
inline fun <R> BooleanArray.fold(
    initial: R, 
    operation: (acc: R, Boolean) -> R
): R
inline fun <R> CharArray.fold(
    initial: R, 
    operation: (acc: R, Char) -> R
): R
@ExperimentalUnsignedTypes inline fun <R> UIntArray.fold(
    initial: R, 
    operation: (acc: R, UInt) -> R
): R
@ExperimentalUnsignedTypes inline fun <R> ULongArray.fold(
    initial: R, 
    operation: (acc: R, ULong) -> R
): R
@ExperimentalUnsignedTypes inline fun <R> UByteArray.fold(
    initial: R, 
    operation: (acc: R, UByte) -> R
): R
@ExperimentalUnsignedTypes inline fun <R> UShortArray.fold(
    initial: R, 
    operation: (acc: R, UShort) -> R
): R

initial 值開始累加值,並將 operation 從左到右應用於當前累加器值和每個元素。

如果數組為空,則返回指定的 initial 值。

參數

operation- 獲取當前累加器值和一個元素並計算下一個累加器值的函數。

用法二

inline fun <T, R> Iterable<T>.fold(
    initial: R, 
    operation: (acc: R, T) -> R
): R

initial 值開始累加值,並將 operation 從左到右應用於當前累加器值和每個元素。

如果集合為空,則返回指定的 initial 值。

參數

operation- 獲取當前累加器值和一個元素並計算下一個累加器值的函數。

用法三

inline fun <T, K, R> Grouping<T, K>.fold(
    initialValueSelector: (key: K, element: T) -> R, 
    operation: (key: K, accumulator: R, element: T) -> R
): Map<K, R>

按鍵對來自Grouping 源的元素進行分組,並將operation 依次應用於每個組的元素,將先前累積的值和當前元素作為參數傳遞,並將結果存儲在新映射中。累加器的初始值由initialValueSelector 函數提供。

例子:



fun main(args: Array<String>) {
//sampleStart
val fruits = listOf("cherry", "blueberry", "citrus", "apple", "apricot", "banana", "coconut")

val evenFruits = fruits.groupingBy { it.first() }
    .fold({ key, _ -> key to mutableListOf<String>() },
          { _, accumulator, element ->
              accumulator.also { (_, list) -> if (element.length % 2 == 0) list.add(element) }
          })

val sorted = evenFruits.values.sortedBy { it.first }
println(sorted) // [(a, []), (b, [banana]), (c, [cherry, citrus])]
//sampleEnd
}

輸出:

[(a, []), (b, [banana]), (c, [cherry, citrus])]

參數

initialValueSelector- 為每個組提供累加器初始值的函數。它使用參數調用:

operation- 使用以下參數在每個元素上調用的函數:

返回一個Map,將每個組的鍵與累積組元素的結果相關聯。

用法四

inline fun <T, K, R> Grouping<T, K>.fold(
    initialValue: R, 
    operation: (accumulator: R, element: T) -> R
): Map<K, R>

按鍵對來自Grouping 源的元素進行分組,並將operation 依次應用於每個組的元素,將先前累積的值和當前元素作為參數傳遞,並將結果存儲在新映射中。累加器的初始值對於每個組都是相同的initialValue

例子:



fun main(args: Array<String>) {
//sampleStart
val fruits = listOf("apple", "apricot", "banana", "blueberry", "cherry", "coconut")

// collect only even length Strings
val evenFruits = fruits.groupingBy { it.first() }
    .fold(listOf<String>()) { acc, e -> if (e.length % 2 == 0) acc + e else acc }

println(evenFruits) // {a=[], b=[banana], c=[cherry]}
//sampleEnd
}

輸出:

{a=[], b=[banana], c=[cherry]}

參數

operation- 使用以下參數在每個元素上調用的函數:

返回一個Map,將每個組的鍵與累積組元素的結果相關聯。