JAVA8带给我们的思考

函数式的思考

这里有个假设问题:目前有3个线程,分别是线程A、B、C,然后这3个线程分别去访问functionXXX,这就意味着functionXXX的内部变化是会影响到线程A、B、C的,除去函数自身本职工作之外,其还影响其他的业务,这种函数是带有副作用的。

所谓的副作用就是函数的效果已经超出了函数自身的范畴,而与之相反的函数则称为:纯粹的函数或者无副作用的函数。

 

为了方便引入概念,我这里再举个例子:甲方要求对数据库中的苹果进行筛选,筛选出重量大于150g,且颜色是淡黄色的苹果?

实现甲方这种需求,从目前来看,就2种方式:

方式一:专注于如何实现,通过大量的if判断、for循环遍历、return等进行编写,这种方式又叫做:“命令式”编程

方式二:专注于要做什么,通过lambda表达式,直接用()->getWieght>150&& getColor = “yellow”就可以完成。这种方式把遍历细节留给了底层API,这种方式又叫做:“声明式”编程

“声明式”编程比“命令式”编程的优点在于:“声明式”编程一眼就能明白甲方的需求,就像是在描述甲方的需求,而“命令式”编程则需要你去看函数,去理清函数的前后逻辑以及函数内部逻辑。

 

“声明式”编程背后有2层含义:

①为了让开发者更加关注于业务,而不是底层实现细节,由系统来选择如何实现。

②既然API底层已经足够强大,那么开发者应该使用不相互影响的表达式来描述自己想要做什么。

再结合上面提到的无副作用函数,最终在这一指导思想下发展出了:函数式编程。

 

那么函数式编程中的“函数”怎么去理解?

答:这里的“函数”,特指的就是无副作用函数,即不会产生/修改可变的共享变量的函数。因此,函数式编程通俗来讲就是:一种使用无副作用函数进行编程的方式。

 

JAVA语言的函数式编程,其理想化的编程准则如下:

①被称为“函数式”的函数或方法都只能修改本地变量。如果引起其他对象,则它所引用的对象都应该是不可修改的对象。通过这种规定,我们期望所有的字段都为final类型,所有的引用类型字段都指向不可变对象。

②被称为函数式的函数或者方法,不应该抛出任何异常。

 

函数式编程还有个特点就是引用透明性

制都隐含着引用透明性。如果一个函数只要传递同样的参数值,总是返回同样的结果,那这个函数就是引用透明的。

换句话说,函数无论在何处调用、何时调用,如果使用同样的输入总能持续地得到相同的结果,就具备了函数式的特征。

通俗来讲就是,无论是单线程访问,还是多线程并发访问,使用同样的输入总能持续地得到相同的结果,也就说即便是多线访问,某个线程的修改对其他线程无影响,包括返回结果、共享变量的可见性等。

 

一等函数:能够像普通变量一样使用的函数称为一等函数。这是Java 8补充的全新内容:通过::操作符,你可以创建一个方法引用,像使用函数值一样使用方法,也能使用Lambda表达式(比如, (int x) -> x + 1)直接表示方法的值。 Java 8中使用下面这样的方法引用将一个方法引用保存到一个变量是合理合法的:

Function<String, Integer> strToInt = Integer::parseInt;

 

函数式编程的世界里,如果函数能满足下面任一要求就可以被称为高阶函数:接受至少一个函数作为参数、返回的结果是一个函数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章