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,将每个组的键与累积组元素的结果相关联。