Kotlin常用的高阶函数(ForEach、Map、Flatmap、Fold、Reduce......)

本文详细介绍了Kotlin中的五个常见高阶函数:ForEach、Map、Flatmap、Reduce 和 Fold 的使用方法与应用场景,通过具体示例展示了如何利用这些函数高效地处理集合数据。

一、ForEach
类型于Java的传统的写法

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {
    //定义一个list
    val list = listOf(1,3,4,5,6,7,43,63)
    //再定义一个arrayList
    val newList = ArrayList<Int>()

    //一个集合的映射
    list.forEach{
        val newElement = it * 2 + 3
        newList.add(newElement)
    }

    newList.forEach(::println)
}

结果是:

5
9
11
13
15
17
89
129

二、Map

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {
    //定义一个list
    val list = listOf(1,3,4,5,6,7,43,63)
    //直接用map输出
    list.map(::println) //纯粹用于迭代的话会影响性能,实现里面还有一个数组
    //public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
    //    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
    //}
    //再定义一个arrayList
    //it就是list里面的元素
    val newList = list.map {
        it * 2 + 3
    }
    //将int转成double,Int代表list中的元素,是采用类的实例去调用的
    val newList2 = list.map(Int::toDouble)

    newList.forEach(::println)
    newList2.forEach(::println)

}

三、Flatmap

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {
    //定义一个整型的集合
    val list = listOf(
            1..20,
            2..15,
            4..53
    )
    //如果想要得到平下来的例如[12...2023..5...],flatMap把集合中的集合打平
    val flatList = list.flatMap {
        it.map {
            "No.$it + ,"
        }
    }
    //1234567891011121314151617181920234567891011121314154567891011121314151617181920212
    // 223242526272829303132333435363738394041424344454647484950515253
    flatList.forEach(::print)
    //No.1 + ,No.2 + ,No.3 + ,No.4 + ,No.5 + ,No.6 + ,No.7 + ,No.8 + ,No.9 + ,No.10 + ,No.11 + ,No.12 + ,No.13 + ,No.14 + ,No.15 + ,No.16 + ,No.17 + ,No.18 + ,No.19 + ,No.20 + ,No.2 + ,No.3 + ,No.4 + ,No.5 + ,No.6 + ,No.7 + ,No.8 + ,No.9 + ,No.10 + ,No.11 + ,No.12 + ,No.13 + ,No.14 + ,No.15 + ,No.4 + ,No.5 + ,No.6 + ,No.7 + ,No.8 + ,No.9 + ,No.10 + ,No.11 + ,No.12 + ,No.13 + ,No.14 + ,No.15 + ,No.16 + ,No.17 + ,No.18 + ,No.19 + ,No.20 + ,No.21 + ,No.22 + ,No.23 + ,No.24 + ,No.25 + ,No.26 + ,No.27 + ,No.28 + ,No.29 + ,No.30 + ,No.31 + ,No.32 + ,No.33 + ,No.34 + ,No.35 + ,No.36 + ,No.37 + ,No.38 + ,No.39 + ,No.40 + ,No.41 +
    // ,No.42 + ,No.43 + ,No.44 + ,No.45 + ,No.46 + ,No.47 + ,No.48 + ,No.49 + ,No.50 + ,No.51 + ,No.52 + ,No.53 + ,
}

四、Reduce

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {
    //定义一个整型的集合
    val list = listOf(
            1..20,
            2..15,
            4..53
    )
    //如果想要得到平下来的例如[12...2023..5...],flatMap把集合中的集合打平
    val flatList = list.flatMap{it}
    flatList.forEach(::println)

    //现在相求整数的和
    println(flatList.reduce { acc, i -> acc + i }) //1754
    //看一下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()) {
            acc就是累加,上一次的结果加上这一次的数
            accumulator = operation(accumulator, iterator.next())
        }
        return accumulator
    }*/

    //求(0..6)的阶乘
    (0..6).map(::factorial).forEach(::println)
}

/**reduce求阶乘*/
//一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。 自然数n的阶乘写作n!。
//例如3的阶乘:1*2*3 = 6
fun factorial(n: Int): Int{
    if (n == 0)return 1
    //如果n >0,本次的acc*下一次的acc
    return (1..n).reduce{acc,i -> acc * i}
}

五、Fold

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //求(0..6)的阶乘
    (0..6).map(::factorial).forEach(::println)
    //1
    //1
    //2
    //6
    //24
    //120
    //720
    //阶乘求和,并给予一个初始值,例如30意思是,阶乘和+30
    println((0..6).map(::factorial).fold(30){
        acc, i ->  acc + i
    })
    //874+30=904

    //将阶乘拼接成字符串
    println((0..6).map(::factorial).fold(StringBuilder()){
        acc, i ->  acc.append(i).append(",")
    })
    //1,1,2,6,24,120,720,

    //拼接字符串神奇
    println((0..6).joinToString(","))
    //0,1,2,3,4,5,6
}

/**reduce求阶乘*/
//一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。 自然数n的阶乘写作n!。
//例如3的阶乘:1*2*3 = 6
fun factorial(n: Int): Int{
    if (n == 0)return 1
    //如果n >0,本次的acc*下一次的acc
    return (1..n).reduce{acc,i -> acc * i}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值