------《Kotlin系列之常见高阶函数详解》

  • 高阶函数:filter
  • 高阶函数:any
  • 高阶函数:maxByOrNull
  • 高阶函数:minByOrNull
  • 高阶函数:map
  • 高阶函数:flatMap
  • 高阶函数:reduce
  • 高阶函数:fold
  • 高阶函数:joinToString
  • 高阶函数:takeWhile
  • 高阶函数:count
  • 高阶函数:find
  • 高阶函数:groupBy



        高阶函数就是多阶映射。高阶函数用另一个函数作为其输入参数,也可以返回一个函数作为输出。

高阶函数:filter

是一个过滤器,能够通过各种条件过滤出符合该条件的数据。

val numbers1 = listOf<Int>(213, 4, 534, 646, 757, 8, 97, 9);
var result = numbers1.filter { 
    it < 10
}

结果:4,8,9

高阶函数:any

用来判断在数据中有没有符合条件的数据,返回的结果为布尔类型的值。true或者false

val numbers1 = listOf<String>("123", "田园犬", "345", "收到");
  println(numbers1.any{it.kind=="田园犬"}) 
  结果:true

高阶函数:maxByOrNull

求最大值

、val numbers2 = listOf<Int>(213, 4, 534, 646, 757, 8, 97, 9);
numbers2.maxByOrNull { it }
结果:757 (最大值)

高阶函数:minByOrNull

求最小值

val numbers2 = listOf<Int>(213, 4, 534, 646, 757, 8, 97, 9);
numbers2.minByOrNull { it }
结果:4(最小值)

高阶函数:map

将一个集合遍历,之后按照你自己的规则生成新的集合。

val arr = intArrayOf(1, 2, 4, 6)
val newArr = arr.map { (it * 2).toString()  }
结果:2,4,8,12

val newArr1 = arr.map {
    if (it == 2) {
        it * 2
    }
}
结果:1,4,4,6

高阶函数:flatMap

遍历嵌套的集合,生成新的集合.

val list = mutableListOf(
    arrayOf("华晨宇", "张碧晨", "邓紫棋"),
    arrayOf("何老师", "汪涵"),
    arrayOf("谢娜", "张杰", "汪诗诗"),
)
val flatList = list.flatMap {
    it.map { name -> "大明星:$name" }
}
flatList.forEach(::println)

高阶函数:reduce

将所提供的操作应用于集合元素并返回积累的结果
从第一个元素开始累加值,并将操作从左到右应用到当前累加器值和每个元素。

val list = listOf(1, 2, 5, 2)
list.reduce { acc, i ->
    println("acc:$acc,i:$i")
    acc + i
}

高阶函数:fold

这个函数和reduce类似,不过它可以设置一个初始值

val list = listOf(1, 2, 5, 2)
list.fold(2) { acc, i ->  //初始值为2
    println("acc:$acc,i:$i")
    acc + i
}

高阶函数:joinToString

val result = (0..6).joinToString(",")
println("result:$result")
结果: "0,1,2,3,4,5,6"

val number = listOf("one", "two", "three", "four")
number.joinToString(separator = " | ", prefix = "start:", postfix = ":end")
结果:start:one|two|three|four|:end

高阶函数:takeWhile

遇到第一个不符合条件的就结束,留下前边的作为一个新的集合返回.

val list = listOf(
    UserEntity(100, "华晨宇", 30),
    UserEntity(101, "张碧晨", 31),
    UserEntity(103, "邓紫棋", 29),
    UserEntity(103, "李宇春", 32),
)
val result = list.takeWhile {
    it.age >= 30
}
println("result:$result")
result:[userName:华晨宇,userId:100,age:30, userName:张碧晨,userId:101,age:31]

高阶函数:count

计算列表中符合条件的元素的数量

val len1 = "Meng qingLong".count()
val len2 = "Meng qingLong".count(){   //计算字符串中符合'n'的数量
    it == 'n'
}

高阶函数:find

查找符合条件并返回第一个符合该条件的数据。他跟filter的区别就是。filter返回的是结果集合。而find是找到第一个就返回。

val listOf = listOf<String>("a", "b", "c")
val find: String? = listOf.find { it == "a" }
//找到"a" 就返回了当前的String类型的"a"

高阶函数:groupBy

分组。即根据条件把集合拆分为为一个Map<K,List>类型的集合

fun main(string: Array<String>) {
    val s = listOf("china","beijing","wuhan","guangzhou","Changsha","wuhu")
    val n1 = s.groupBy {
        //按照首字母大写进行分组操作
        it.first().uppercase()   
        //返回成Map的Key。  满足条件的元素相应的进入Map集合中的Value,List列表中
    }
    println(n1)
}
//输出
{C=[china, Changsha], B=[beijing], W=[wuhan, wuhu], G=[guangzhou]}