12. 内置高阶函数
2022年5月19日
12. 内置高阶函数
1. 获取最大值和最小值
1.1 处理基础类型 min/max
minOrNull
和maxOrNull
val array = arrayOf(4, 3, 65, 34, 1)
array.minOrNull()
array.minOrNull()
val list = listOf(5, 321, 4, 2, 5, 123, 4)
val minOrNull = list.minOrNull()
val maxOrNull = list.maxOrNull()
println(minOrNull)
println(maxOrNull)
1.2 处理所有类型最大值,最小值(minBy,maxBy)
根据对象的属性,找出对应的集合中的元素
数据类
data class People(val name: String = "测试", val age: Double)
val data = listOf(
People("赵", 5),
People("钱", 3),
People("孙", 51),
People("李", 54)
)
val minByOrNull = data.minByOrNull { it.name }
val maxByOrNull = data.maxByOrNull { it.name }
println(minByOrNull)
println(maxByOrNull)
2. 求和(sumof)
val data = listOf(
People("赵", 5.0),
People("钱", 3.0),
People("孙", 51.0),
People("李", 54.0)
)
val minByOrNull = data.sumOf { it.age }
3. 转换集合(map)
根据lambda表达式,返回对应的集合
val data = listOf(
People("赵", 5.0),
People("钱", 3.0),
People("孙", 51.0),
People("李", 54.0)
)
val minByOrNull:List<Double> = data.map { it.age }
4. fliter
根据表达式条件转换集合
val data = listOf(
People("赵", 5.0),
People("钱", 3.0),
People("孙", 51.0),
People("李", 54.0)
)
val minByOrNull:List<Double> = data.map { it.age }.filter { it<10 }
minByOrNull.forEach { println(it) }
5. 分组(groupBy)
根据元素中的属性的值分组
val data = listOf(
People("赵", 5.0),
People("钱", 5.0),
People("孙", 51.0),
People("李", 54.0)
)
val minByOrNull:Map<Double,List<People>> = data.groupBy { it.age }
minByOrNull.forEach { println(it) }
6. fold
指定一个初始值,让集合中的每个元素对它执行操作。
操作的参数有两个,累计值和集合元素。
可以做递增,递减,字符串连接,初始值减去元素的总和等。
6.1 递增
val data = listOf(
People("赵", 5),
People("钱", 5),
People("孙", 51),
People("李", 54)
)
val fold = data.fold(0) { run,item ->
println(run+item.age)
run+item.age
}
println(fold)
可以看出,每次输入的值都在依次改变
6.2 字符串连接-依次执行
fold
val data = listOf(
People("赵", 5),
People("钱", 5),
People("孙", 51),
People("李", 54)
)
val fold = data.fold("") { run,item ->
run+"姓氏:"+item.name+" 年龄:"+item.age+"\n"
}
println(fold)
从右向左就是foldRight
reduce
reduce用法和fold类似,reduce第一步将第一个元素和第二个元素作为第一步的操作参数。
val data = listOf(
People("赵", 5),
People("钱", 5),
People("孙", 51),
People("李", 54)
)
val fold = data.reduce {sum, element ->
println(sum.age+element.age)
element
}
println(fold)
输出
10
56
105
People(name=李, age=54)
reduce只能返回集合的元素的类型