【Kotlin】高阶函数

184 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

运行结果是一样的