目录
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=女)]