1.设计原则1.1.将所有你愿意接受的作为参数的函数可能带来的副作用以文档的方式记录下来1.2.最理想的情况下你接收的函数参数应该没有任何副作用1.3.延迟数据结构是强力武器1.4.所有使用持久化数据结构的用户都必须遵守“不修改”原则2.一等函数2.1.first-class function2.2.能够像普通变量一样使用的函数2.2.1.可以作为参数传递2.2.2.可以作为结果返回2.2.3.能存储在数据结构中的函数2.3.::操作符2.3.1.创建一个方法引用,像使用函数值一样使用方法2.4.Lambda表达式2.4.1.直接表示方法的值3.高阶函数3.1.higher-order function3.2.接受至少一个函数作为参数3.3.返回的结果是一个函数3.4.满足任一要求3.4.1.comparing3.4.2.andThen3.4.3.compose4.柯里化4.1.帮助你模块化函数和重用代码的技术4.2.将具备两个参数(比如,x和y)的函数f转化为使用一个参数的函数g,并且这个函数的返回值也是一个函数,它会作为新函数的一个参数4.3.后者的返回值和初始函数的返回值相同,即f(x, y) = (g(x))(y)5.部分求值5.1.partially applied5.2.当一个函数使用的所有参数仅有部分(少于函数的完整参数列表)被传递时6.持久化数据结构6.1.数据结构的值始终保持一致,不受其他部分变化的影响6.2.final只能应用于类的字段,无法应用于它指向的对象,如果你想要对对象进行保护,则需要将其中的字段声明为final,以此类推6.3.在其被修改之前会对自身前一个版本的内容进行备份6.4.能避免不必要的防御式复制7.数据库中的持久化7.1.生命周期比程序的执行周期更长的数据8.函数式更新8.1.禁止使用带有副作用的方法8.2.没有改动任何现存的数据结构8.3.会导致过度的对象复制9.fupdate9.1.纯函数式9.2.会创建一个新的树,并将其作为结果返回,通过参数的方式实现共享10.update10.1.每一个update的用户都希望共享同一份数据结构,也希望能了解程序任何部分所做的更新11.延迟计算11.1.无法声明一个递归的Stream,因为Stream仅能使用一次11.1.1.一旦你对Stream执行一次终端操作调用,它就永久地终止了11.2.如果它们能让程序设计更简单,就尽量使用它们11.3.如果它们会带来无法接受的性能损失,就尝试以更加传统的方式重新实现它们11.4.可以通过辅助方法(supplier)即时地创建列表中的元素11.4.1.辅助方法能帮忙创建更多的数据结构12.结合器12.1.函数式的思想12.2.将两个或多个函数或者数据结构进行合并12.3.接受两个或多个方法(函数)做参数且返回结果是另一个函数的方法13.记忆表13.1.memoizatio)13.2.为方法添加一个封装器,在其中加入一块缓存13.3.遵守“引用透明性”原则的函数,其计算结构可以进行缓存14.引用透明性原则14.1.使用相同的参数产生同样的结果14.2.使用equal对数据结构值进行比较15.模式匹配15.1.函数式的特性15.1.1.能帮助解包数据类型15.1.2.访问者模式15.1.3.Java语言中switch语句的一种泛化15.2.模式匹配为操纵类树型数据结构提供了一个极其详细又极富表现力的方式15.2.1.Scala是面向表达式的15.2.2.可以避免出现大量嵌套的switch或者if-then-else语句和字段选择操作相互交织的情况15.2.3.Java的switch和if-then-else无法完全实现模式匹配的思想15.3.用Lambda,原则上你的代码里不应该使用if-then-else15.3.1.方法调用15.3.1.1.myIf(condition, () -> e1, () -> e2);15.3.1.2.
static T myIf(boolean b, Supplier truecase, Supplier falsecase) { return b ? truecase.get() : falsecase.get(); }
15.3.2.Lambda表达式能以简单的方式实现单层的模式匹配