目录
1、Java原型
现在假设这么一种情况,我们有一个人员的List我们需要筛选出这个List中年龄大于指定年龄的人的List,那么先来看一下普通实现。
fun main() {
//模拟出人员List
val personList = mutableListOf<Person>()
repeat(10) {
if (it % 2 == 0) {
personList.add(Person("小子$it", 13 + it, "男"))
} else {
personList.add(Person("小子$it", 13 + it, "女"))
}
}
val needList = needPersonList(personList, 18)
println("needList=$needList")
}
fun needPersonList(list: List<Person>, needAge: Int): List<Person> {
val needList = mutableListOf<Person>()
for (person in list) {
if (person.age > needAge) {
needList.add(person)
}
}
return needList
}
//输出结果
needList=[Person(name=小子6, age=19, sex=男), Person(name=小子7, age=20, sex=女),
Person(name=小子8, age=21, sex=男), Person(name=小子9, age=22, sex=女)]2、高阶函数简化Java函数
现在我们有这么一种情况,我不仅想要筛选出年龄大于指定年龄的人,性别也要筛选,如果用上面的方法的话,我们需要再添加一个参数,还要在函数中再添加一层判断如下:
fun needPersonList0(list: List<Person>, needAge: Int, sex: String): List<Person> {
val needList = mutableListOf<Person>()
for (person in list) {
if (person.age > needAge && person.sex == sex) {
needList.add(person)
}
}
return needList
}如果以后不断的添加判断条件,我们就需要不断的对这个函数进行重写,那么怎么解决这种情况,高阶函数可以帮助我们解决这种情况的出现,高阶函数就是该函数的参数也是函数,具体可以看这里。
改进的代码如下:可以看到我们可以在另一个函数isAgeAndSex()中随意更改筛选条件但是都不影响我们needPersonList()的代码。
fun main() {
//模拟出人员List
val personList = mutableListOf<Person>()
repeat(10) {
if (it % 2 == 0) {
personList.add(Person("小子$it", 13 + it, "男"))
} else {
personList.add(Person("小子$it", 13 + it, "女"))
}
}
val isAgeSex = ::isAgeAndSex
val needList2 = needPersonList1(personList, isAgeSex)
println("needList2=$needList2")
}
fun isAgeAndSex(person: Person): Boolean {
return person.age > 18 && person.sex == "女"
}
fun needPersonList1(list: List<Person>, need: (person: Person) -> Boolean): List<Person> {
val needList = mutableListOf<Person>()
for (person in list) {
if (need(person)) {
needList.add(person)
}
}
return needList
}
//输出结果
needList2=[Person(name=小子7, age=20, sex=女), Person(name=小子9, age=22, sex=女)]2.1、:: 的作用
你看到上面的双引号肯定很困惑,它是干什么用的呢?它有引用的作用,就是将一个函数引用过来,作为参数的形式传给另一个函数。
就比如上面的情况,我们无法直接将isAgeAndSex()函数作为参数传给needPersonList()函数,只能通过函数引用的方式。他还有其他作用。
通过下面的例子,我们看的出来:双引号前面的是函数的参数,后面的是返回的值
参数 ::返回值
//这里的getPerson等于函数 getPerson(name:String,age:Int,sex:String) -> Person
val getPerson = ::Person
println(getPerson("小白", 18, "男"))
//这里的getName等于函数 getName(person:Person) -> String
val getName = Person::name
println(getName(Person("小女", 19, "女")))
//输出结果
Person(name=小白, age=18, sex=男)
小女3、匿名函数简化Java函数
如果我不想为了写一个筛选条件,单独写一个isAgeAndSex()函数的话,我们怎么怎么做,这里匿名函数可以帮我们解决这个问题,匿名函数:没有名字的函数。
看下面的代码,我们不需要单独创建一个函数,只需要在参数中直接将这个匿名函数加入进入就可以了。
fun main() {
//模拟出人员List
val personList = mutableListOf<Person>()
repeat(10) {
if (it % 2 == 0) {
personList.add(Person("小子$it", 13 + it, "男"))
} else {
personList.add(Person("小子$it", 13 + it, "女"))
}
}
val needList3 = needPersonList1(personList, fun(person: Person): Boolean {
return person.age > 18 && person.sex == "女"
})
println("needList3=$needList3")
}
fun needPersonList1(list: List<Person>, need: (person: Person) -> Boolean): List<Person> {
val needList = mutableListOf<Person>()
for (person in list) {
if (need(person)) {
needList.add(person)
}
}
return needList
}
//输出结果
needList3=[Person(name=小子7, age=20, sex=女), Person(name=小子9, age=22, sex=女)]
4、Lambda简化Java函数
如果你了解Lambda函数的话,它是可以函数的标示fun 去掉,还可以帮我们去掉参数中的 fun(person: Person): Boolean 中的类型的,所以代码我们就简化成了下面的版本,是不是很简洁,功能还比Java式的代码强大了很多啊?
fun main() {
//模拟出人员List
val personList = mutableListOf<Person>()
repeat(10) {
if (it % 2 == 0) {
personList.add(Person("小子$it", 13 + it, "男"))
} else {
personList.add(Person("小子$it", 13 + it, "女"))
}
}
val needList4 = needPersonList1(personList) { person ->
person.age > 18 && person.sex == "女"
}
println("needList4=$needList4")
}
fun needPersonList1(list: List<Person>, need: (person: Person) -> Boolean): List<Person> {
val needList = mutableListOf<Person>()
for (person in list) {
if (need(person)) {
needList.add(person)
}
}
return needList
}
//输出结果
needList4=[Person(name=小子7, age=20, sex=女), Person(name=小子9, age=22, sex=女)]
版权声明:本文为qq_34589749原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。