变量的修改结果无法预知源于共享的可变数据,很难追踪是哪个实例修改了变量。
如果一个方法只是把计算结果return,而不修改内部状态,这个方法就是无副作用的。
我们允许函数内部执行一些非函数式带有副作用的操作,只要这些操作的结果不会暴露给系统中的其他部分,调用者不需要知道,或者完全不在意这些副作用,因为这对它完全没有影响。
我们的准则是,被称为“函数式”的函数或方法都只能修改本地变量。除此之外,它引用的对象都应该是不可修改的对象。所有的字段都是final类型,引用类型(即非基本类型)字段都指向不可变对象。
函数或者方法不应该抛出任何异常,不再像预期那样,返回一个恰当的结果值。对于诸如除数是零这种异常情况,使用Optional类型,要么成功返回值,要么返回对象表示其无法进行指定的操作。也可以选择在本地局部使用异常,避免通过接口将结果暴露给其他方法,不会过去膨胀代码。
函数式编程写出来的代码,可以在任何时候作为函数被其他地方复用。
递归和迭代
像while或者for这样的迭代构造器经常隐藏着陷阱,诱使你修改对象。比如while循环中,循环的条件需要更新。尽量使用Stream代替迭代,避免变化带来的影响。
技巧
高阶函数
能够接受至少一个函数作为参数,或者返回的结果是一个函数。
// 返回一个函数
Function<Integer, String> getMyFunction() {
return (it) -> "Hello, world: " + it;
}
网友评论