基于Kotlin的函数式编程

        什么是函数式编程,就是把“怎么做”简化成“要做某某”。这么说起来有点粗糙,打个简单的比喻:我叫小明去帮我买一瓶酱油,“怎么做”和小明说:我给你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
    }

}
这样调用的时候只需要传递比较的方法,返回的就是按照比较的规律查找出来的结果。这样两个方法就合并成一个方法了,以后扩展的时候也不需要创建新的方法。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值