在前面的章节我们快速进修了lambda和Stream,本章节中我们往返首和领略函数式编程的思想。 我们不绝的提及函数式这个名词,它指的是lambda吗?假如是这样,回收函数式编程能为你带来什么长处呢?
函数式的思考
呼吁式编程
一般我们实现一个系统有两种思考方法,一种专注于如何实现,好比下厨做菜,凡是凭据本身熟悉的烹调要领:首先洗菜, 然后切菜,热油,下菜,软件开发,然后…… 这看起来像是一系列的呼吁合集。对付这种”如何做”式的编程气势气魄我们称之为呼吁式编程, 它的特点很是像工场的流水线、计较机的指令处理惩罚,都是串行化、呼吁式的。
CookingTask cookingTask = new CookingTask(); cookingTask.wash(); cookingTask.cut(); cookingTask.deepFry(); cookingTask.fried(); ...
声明式编程
尚有一种方法你存眷的是要做什么,我们假如用lambda和函数式来办理上述问题应该是这样的:
public class CookingDemo { public void doTask(String material, Consumer<String> consumer) { consumer.accept(material); } public static void main(String[] args) { CookingDemo cookingDemo = new CookingDemo(); cookingDemo.doTask("蔬菜", material -> System.out.println("清洗" + material)); cookingDemo.doTask("蔬菜", material -> System.out.println(material + "切片")); cookingDemo.doTask("食用油", material -> System.out.println(material + "烧热")); cookingDemo.doTask("", material -> System.out.println("炒菜")); } }
这里我们将烹调的实现细节交给了函数库,它最大的优势在于你读起来就像是在问题告诉,回收这种方法我们很快可以领略它的成果, 当你在烹调流程中添加其他步调也变得很是简朴,你只需要挪用doTask要领将质料通报进去处理惩罚,好比在食用油烧热前我要打个鸡蛋
cookingDemo.doTask("鸡蛋", material -> System.out.println(material + "打坏搅拌匀称"));
而不消再编写一个处理惩罚鸡蛋的要领。
什么是函数式编程
对付“什么是函数式编程”这一问题最简化的答复是“它是一种利用函数举办编程的方法”。 每小我私家的领略都是差异的,其焦点是:在思考问题时,利用不行变值和函数,函数对一个值举办处理惩罚,映射成另一个值。
差异的语言社区往往对各自语言中的特性自命不凡。此刻谈Java措施员如何界说函数式编程还为时尚早, 可是,软件开发,这基础不重要!我们体贴的是如何写出好代码,而不是切合函数式编程气势气魄的代码。
我们想象一下设计一个函数,输入一个字符串范例和布尔范例参数,输出一个整形参数。
int pos = 0; public Integer foo(String str, boolea flag){ if(flag && null != str){ pos++; } return pos; }
这个例子有输入也有输出,同时每次挪用也大概会更行外部的变量值,这样的函数我们称之为是有副浸染的函数。
在函数式编程的上下文中,一个“函数”对应于一个数学函数:它接管零个或多个参数,生成一个或多个功效,而且不会有任何副浸染。 你可以把它当作一个黑盒,它吸收输入并发生一些输出,像下面的函数
public Integer foo(String str, boolea flag){ if(flag && null != str){ return 1; } return 0; }
这种范例的函数和你在Java编程语言中见到的函数之间的区别长短常重要的(我们无法想象,log可能sin这样的数学函数会有副浸染)。 尤其是,利用同样的参数挪用数学函数,它所返回的功效必然是沟通的。这里,我们临时不思量Random.nextInt这样的要领,
函数的副浸染
当谈论“函数式”时,我们想说的其实是“像数学函数那样——没有副浸染”。由此,编程上的一些精妙问题随之而来。 我们的意思是,每个函数都只能利用函数和像if-then-else这样的数学思想来构建吗? 可能,我们也答允函数内部执行一些非函数式的操纵,只要这些操纵的功效不会袒露给系统中的其他部门? 换句话说,假如措施有必然的副浸染,不外该副浸染不会为其他的挪用者感知,是否我们能假设这种副浸染不存在呢? 挪用者不需要知道,可能完全不在意这些副浸染,因为这对它完全没有影响。
当我们但愿能界定这二者之间的区别时,我们将第一种称为纯粹的函数式编程,后者称为函数式编程。