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

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

package net.println.kotlin.chapter5.builtins

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

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

    //一个集合的映射
    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) {
    //定义一个list
    val list = listOf(1,3,4,5,6,7,43,63)
    //直接用map输出
    list.map(::println) //纯粹用于迭代的话会影响性能,实现里面还有一个数组
    //public inline fun  Iterable.map(transform: (T) -> R): List {
    //    return mapTo(ArrayList(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) {
    //定义一个整型的集合
    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) {
    //定义一个整型的集合
    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  Iterable.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) {

    //求(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}
}

你可能感兴趣的:(Kotlin语言,Kotlon,高阶函数,ForEach,Map,Flatmap)