当前位置: 代码迷 >> 综合 >> Kotlin-29-高阶函数、匿名函数、Lambda简化Java函数
  详细解决方案

Kotlin-29-高阶函数、匿名函数、Lambda简化Java函数

热度:11   发布时间:2023-10-09 05:26:14.0

目录

1、Java原型

2、高阶函数简化Java函数

2.1、::  的作用

3、匿名函数简化Java函数

4、Lambda简化Java函数


1、Java原型

现在假设这么一种情况,我们有一个人员的List我们需要筛选出这个List中年龄大于指定年龄的人的List,那么先来看一下普通实现。

fun main() {//模拟出人员Listval 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() {//模拟出人员Listval personList = mutableListOf<Person>()repeat(10) {if (it % 2 == 0) {personList.add(Person("小子$it", 13 + it, "男"))} else {personList.add(Person("小子$it", 13 + it, "女"))}}val isAgeSex = ::isAgeAndSexval 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) -> Personval getPerson = ::Personprintln(getPerson("小白", 18, "男"))//这里的getName等于函数 getName(person:Person) -> Stringval getName = Person::nameprintln(getName(Person("小女", 19, "女")))//输出结果Person(name=小白, age=18, sex=男)小女

3、匿名函数简化Java函数

如果我不想为了写一个筛选条件,单独写一个isAgeAndSex()函数的话,我们怎么怎么做,这里匿名函数可以帮我们解决这个问题,匿名函数:没有名字的函数。

看下面的代码,我们不需要单独创建一个函数,只需要在参数中直接将这个匿名函数加入进入就可以了。

fun main() {//模拟出人员Listval 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() {//模拟出人员Listval 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=女)]