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

目录

1、Java原型

2、高阶函数简化Java函数

2.1、::  的作用

3、匿名函数简化Java函数

4、Lambda简化Java函数


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版权协议,转载请附上原文出处链接和本声明。