持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
高阶函数
maxBy、minBy
行为参数化 1、把筛选的行为(函数)作为参数传递到过滤器里面 2、简洁代码,提高效率
高阶函数:一个用函数作为参数或者返回值的函数
现在有个需求,找到宿舍中最年长的舍友,如果按照java程序员的思路是这样写的
var maxAge = 0
for(girl in girls){
if(girl.age > maxAge){
maxAge = girl.age
}
}
println("年龄最大的值是${maxAge}")
for(girl in girls){
if(girl.age == maxAge){
println(girl)
}
}

如果是Kotlin程序员,这个需求对于他们来说就太简单了
println(girls.maxBy{it.age})
maxBy方法返回第一个满足指定评判标准的最大值

也可以找到年龄最低的舍友
println(girls.minBy{it.age})

filter
现在筛选年龄<29,身高>165的舍友
println(girls.filter{
(it.age<29) and (it.height > 160)
})
map
高阶函数-map 1、把妹子某个属性映射成新的集合 2、把所有妹子的名字列出来放入新的集合
println(girls.map{
"${it.name}:${it.age}"
})
any
判断有没有29岁的舍友
println(girls.any{
it.age == 29
})
true
count
查找年龄<29岁的舍友的数量
println(girls.count{
it.age < 29
})
find
找到第一个符合条件的舍友并返回,例如查找地址为福建的舍友
println(girls.find{
it.address == "福建"
})

groupBy
高阶函数-groupBy 1、按照特征把妹子分为不同的组 2、不同地区的妹子在不同的组
按照地区进行分组
println(girls.groupBy{
it.address
})
查看运行结果
{沧州=[Girl(name=琼琼, age=27, height=163, address=沧州)],
廊坊=[Girl(name=嫚嫚, age=29, height=160, address=廊坊), Girl(name=二帆, age=30, height=160, address=廊坊)],
福建=[Girl(name=真真, age=28, height=168, address=福建)],
贵州=[Girl(name=富婆, age=30, height=158, address=贵州)]}
查找地区为廊坊的小伙伴,并打印,注意?,不为空打印
girls.groupBy{
it.address
}.get("廊坊")?.forEach{
println(it)
}

DSL
DSL(领域特定的语言) 1、扩展函数 2、中缀表达式
扩展函数
在Girls.kt中增加一个方法
fun List<Girl>.findAge(age:Int){
filter{
it.age < age
}.forEach{
println(it)
}
}
测试下
fun main(args: Array<String>) {
girls.findAge(28)
}

我们可以用关键字infix修改方法
infix fun List<Girl>.findAge(age:Int){
filter{
it.age < age
}.forEach{
println(it)
}
}
调用的时候就可以直接空格调用了
girls findAge 28
运行结果是一样的