今天和同事的一番对话,引起了我对java函数式编程和scala函数式编程的思考。
我: java (x,y)->(x+y) x,y,的类型必须提前定义好吗? 不能说我(int x,long y)->x+y
同事:如果你说的是函数式编程在java中的使用 则(x,y)->(x+y)必然是一个函数式接口的唯一的一个抽象方法
那此时x,y的类型一定是确定的。他是使用流中的元素作为唯一固定的参数
我: 唯一固定的参数√明白了。java和scala的函数式编程有根本性的区别
同事:你说一下。函数式编程应该是固定的,不可能会出现你说的这种情况,有区别 概念本质是不会有偏差的
有的只是方法的实现出现偏差。我:scala是函数式编程语言,函数是一等公民。
java 类和对象是一等公民
scala里允许在流的内部定义参数
而java 只能是list对象作为唯一参数去创建流同事:这个 其实java 流是可以改变后面的参数的,map方法其实本质上就是在转化传输的流的元素类型。
我: 可以改变,但不可以另行定义。
函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。
当然,大家应该都知道面向对象的特性(抽象、封装、继承、多态)。其实在Java8出现之前,我们关注的往往是某一类对象应该具有什么样的属性,当然这也是面向对象的核心--对数据进行抽象。但是java8出现以后,这一点开始出现变化,似乎在某种场景下,更加关注某一类共有的行为(这似乎与之前的接口有些类似),这也就是java8提出函数式编程的目的。
-------------------- 2020/09/18
java1.8使用函数式编程的推手:在计算机资源不再是严重限制时(函数式编程比指令编程更消耗资源),提高开发效率就是一个摆在眼前的问题。