读函数式编程思维笔记02_转变思维
1.命令式编程
1.1.按照“程序是一系列改变状态的命令”来建模的一种编程风格
1.2.传统的for循环
1.2.1.确立初始状态
1.2.2.每次迭代都执行循环体中的一系列命令
1.2.2.1.将操作安排在循环内部去执行
1.3.Java
1.3.1.消除了垃圾收集的麻烦
2.函数式编程
2.1.程序描述为表达式和变换,以数学方程的形式建立模型,并且尽量避免可变的状态
2.2.不会用很多抽象,但每个抽象的泛化程度都很高(特化的方面通过高阶函数注入)
2.3.以参数传递和函数的复合作为主要的表现手段
2.4.不需要掌握太多作为“不确定因素”存在的其他语言构造之间的交互规则
2.5.操作(filter、transform、convert),每一种都作为一个逻辑分类由不同的函数所代表,这些函数实现了低层次的变换,但依赖于开发者定义的高阶函数作为参数来调整其低层次运转机构的运作
2.6.好处
2.6.1.换一种角度去归类问题,看到问题的共性
2.6.2.让运行时有更大的余地去做智能的优化
2.6.3.让埋头于实现细节的开发者看到原本视野之外的一些解决方案
2.6.4.在更高的抽象层次上做事情,运行时才好去优化低层次的细节
2.7.Clojure
2.7.1.抹去了并发的麻烦
2.7.2.Lisp灵活的语法
2.7.2.1.什么时候可读性变差了,我们就调整语法去满足可读性
3.完美数的分类问题
3.1.一个完美数的真约数(即除了自身以外的所有正约数)之和,恰好等于它本身
3.2.命令式解法
3.3.稍微向函数式靠拢的完美数分类解法
3.4.完美数分类的Java 8实现
3.4.1.缓求值(lazy evaluation)
3.5.完美数分类的Functional Java实现
3.5.1.Java8之前的实现方式
3.5.2.用匿名内部类来模拟高阶函数的编程风格
3.5.3.高阶函数消除了摩擦
4.基本构造单元
4.1.筛选(filter)
4.1.1.根据用户定义的条件来筛选列表中的条目,并由此产生一个较小的新列表
4.1.2.将用户(通常以高阶函数的形式)给定的布尔逻辑作用于集合,返回由原集合中符合条件的元素组成的一个子集
4.1.3.Scala
4.1.3.1.filter()
4.1.3.1.1.返回所有匹配元素的集合
4.1.3.2.partition()
4.1.3.2.1.由原集合的内容划分而成的两个集合,原集合本身保持不变
4.1.3.3.find()
4.1.3.3.1.只返回第一个匹配项
4.1.3.4.takeWhile()
4.1.3.4.1.从集合头部开始,一直取到第一个不满足断言的元素
4.1.3.5.dropWhile()
4.1.3.5.1.从集合头部开始,一直丢弃满足断言的元素,直到遇到第一个非匹配项
4.1.4.Groovy
4.1.4.1.findAll()
4.1.4.2.split()
4.1.4.3.find()
4.1.4.4.takeWhile()
4.1.4.5.dropWhile()
4.1.5.Clojure
4.1.5.1.(filter )
4.2.映射(map)
4.2.1.对原集合的每一个元素执行给定的函数,从而变换成一个新的集合
4.2.2.传给映射函数的是一个高阶函数和一个集合,它在对集合中的每一个元素施用传入的函数之后,产生另一个集合作为返回值
4.2.2.1.返回的集合大小与原来传入的集合相同,只是元素的取值变了
4.2.3.展平(flattening)
4.2.3.1.用来消除嵌套的库函数
4.2.4.Scala
4.2.4.1.map()
4.2.4.2.flatMap()
4.2.5.Groovy
4.2.5.1.collect()
4.2.5.1.1.it关键字作为参数占位标记
4.2.5.2.flatten()
4.2.6.Clojure
4.2.6.1.(map )
4.2.6.2.(flatten )
4.3. ***折叠(fold)/
化约(reduce)***