什么是函数式编程,就是把“怎么做”简化成“要做某某”。这么说起来有点粗糙,打个简单的比喻:我叫小明去帮我买一瓶酱油,“怎么做”和小明说:我给你10块钱你出门左转...到城东再右转...到了xx小卖部买瓶酱油...记得找钱...;"要做某某"和小明这样说:小明去帮我打瓶酱油。这就是区别,去掉中间过程只提核心内容。
下面用代码的方式来表达下:
//创建一个苹果对象 包含三个属性:颜色、大小、品牌
class Apple constructor(val color:String,val scale:Int,val brand:String)
//创建一个苹果查找工具
class SimpleTest {
//仓库里的苹果
val apples:List<Apple> = ArrayList()
//按照颜色来查找
fun findByColor(c:String): ArrayList<Apple> {
//创建一个临时的容器
val list = ArrayList<Apple>()
//遍历仓库
apples.forEach {
if (it.color == c)
list.add(it)
}
return list
}
}
如果我又要添加一个按照大小查找的方法就会变成这样
//创建一个苹果查找工具
class SimpleTest {
//仓库里的苹果
val apples:List<Apple> = ArrayList()
//按照颜色来查找
fun findByColor(c:String): ArrayList<Apple> {
//创建一个临时的容器
val list = ArrayList<Apple>()
//遍历仓库
apples.forEach {
if (it.color == c)
list.add(it)
}
return list
}
//按照大小来查找
fun findByScale(s:Int): ArrayList<Apple> {
//创建一个临时的容器
val list = ArrayList<Apple>()
//遍历仓库
apples.forEach {
if (it.scale == s)
list.add(it)
}
return list
}
}
两个方法看起来只有在for循环里的判断不一样,其他的地方都是没有变的,所以这里的“做什么”已经很明显了,这里的做什么应该让调用者去表达,而不是被调用者。下面我们再改改.
//创建一个苹果查找工具
class SimpleTest {
//仓库里的苹果
val apples: List<Apple> = ArrayList()
//按照颜色来查找
fun findByColor(c: String): ArrayList<Apple> {
//创建一个临时的容器
val list = ArrayList<Apple>()
//遍历仓库
apples.forEach {
if (it.color == c)
list.add(it)
}
return list
}
//按照大小来查找
fun findByScale(s: Int): ArrayList<Apple> {
//创建一个临时的容器
val list = ArrayList<Apple>()
//遍历仓库
apples.forEach {
if (it.scale == s)
list.add(it)
}
return list
}
fun findApple(find: (apple: Apple) -> Boolean): ArrayList<Apple> {
val list = ArrayList<Apple>()
apples.forEach {
if (find(it))
list.add(it)
}
return list
}
}
这样调用的时候只需要传递比较的方法,返回的就是按照比较的规律查找出来的结果。这样两个方法就合并成一个方法了,以后扩展的时候也不需要创建新的方法。