【Kotlin】函数式编程

84 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

函数式编程

传统模式
求解:(1+2)*3-4
var a = 1+2;
var b = a*3;
var c = b-4;
函数式编程
var result = substract(multiply(add(1,2),3),4);
改写:
add(1,2).multiply(3).substract(4)
函数式编程的优点
1、简洁,方便理解
2、方便程序修改和扩展

举个栗子:forEach

var print = fun (name:String):Unit{
	println(name)
}

fun main(args: Array<String>) {
	var names = listOf<String>("Tom,Jerry,Lucy")
	//forEach接收的参数为一个函数
	names.forEach(print)
}

运行结果

Tom,Jerry,Lucy

forEach接收的参数为一个函数,这个函数叫action,这个函数的作用就是:在集合里遍历,对于每个element都执行这个函数

在这里插入图片描述 所以上边的代码等价于

	for(element in names){
		println(element)
	}

forEach就是一个高阶函数,高阶函数就是参数或返回值是函数的函数

刚才的写法是比较麻烦的,简化如下:

	var names = listOf<String>("Tom,Jerry,Lucy")
	names.forEach{
		a -> println(a)
	}

forEach后边跟一个大括号,里边是一个匿名函数,参数是a,函数的内容是println(a)

还可以进一步简化,参数默认是it

	var names = listOf<String>("Tom,Jerry,Lucy")
	names.forEach{
		println(it)
	}

这样的一段代码,就叫闭包

一段程序代码通常由常量、变量和表达式组成,然后使用一对花括号“{}”来表示闭合,并包裹着这些代码,由这对花括号包裹着的代码块就是一个闭包

传统写法的缺点

现在有一个类Girl,里边存储了同宿舍女生的信息

data class Girl(var name:String,var age:Int,var height:Int,var address:String)
var girls = listOf<Girl>(
	Girl("琼琼",27,163,"沧州"),
	Girl("嫚嫚",29,160,"廊坊"),
	Girl("二帆",30,160,"廊坊"),
	Girl("真真",28,168,"福建"),
	Girl("富婆",30,158,"贵州")
)

==传送门:==【Kotlin】data class

现在筛选出廊坊的舍友,写一个测试类HelloWorld

fun main(args: Array<String>) {
	var langfangGirl = ArrayList<Girl>()
	for(girl in girls){
		if(girl.address == "廊坊"){
			langfangGirl.add(girl)
		}
	}
	for(girl in langfangGirl){
		println("${girl.address} ${girl.age}${girl.name}")
	}
}

在这里插入图片描述

当然可以在Girl.kt中写一个方法

......
fun filterByAddress(address:String){
	var addressGirls = ArrayList<Girl>()
	for(girl in girls){
		if(girl.address == address){
			addressGirls.add(girl)
		}
	}
	for(girl in addressGirls){
		println("${girl.address} ${girl.age}${girl.name}")
	}
}

测试类中可以直接调用了

fun main(args: Array<String>) {
	filterByAddress("贵州")
}

在这里插入图片描述

现在要通过年龄筛选,所以再增加一个按年龄筛选的方法,筛选出小于某一年龄的舍友

fun filterByAge(age:Int){
	var ageGirls = ArrayList<Girl>()
	for(girl in girls){
		if(girl.age < age){
			ageGirls.add(girl)
		}
	}
	for(girl in ageGirls){
		println("${girl.address} ${girl.age}${girl.name}")
	}
}

现在又要通过地址和年龄两个筛选条件筛选,所以再增加一个方法

fun filterByAddressAge(address:String,age:Int){
	var addressAgeGirls = ArrayList<Girl>()
	for(girl in girls){
		if((girl.address == address) and (girl.age < age)){
			addressAgeGirls.add(girl)
		}
	}
	for(girl in addressAgeGirls){
		println("${girl.address} ${girl.age}${girl.name}")
	}
}

通过上边的需求的不断变化,可以发现,几个需求的实现方法基本是复制粘贴,那么怎样让代码更简洁呢,需要了解高阶函数的知识了,我们明天继续