java1.8函数式编程概念

时间:2023-03-09 20:35:27
java1.8函数式编程概念

有关函数式编程

·1 函数作为一等公民

  特点:将函数作为参数传递给另外一个函数;函数可以作为另外一个函数的返回值

·2 无副作用

  函数的副作用指的是函数在调用过程中,除了给出了返回值外,还修改了函数外部的状态,比如,函数在调用过程中,修改了某一个全局状态。

显式函数指函数与外界交换数据的唯一渠道就是参数和返回值,显式函数不会去读取或者修改函数的外部状态。与之相对的是隐式函数,隐式函数除了参数和返回值外,还会读取外部信息,或者可能修改外部信息。

·3 申明式的(Declarative)

  对于申明式的编程范式,你不在需要提供明确的指令操作,所有的细节指令将会更好的被程序库所封装,你要做的只是提出你要的要求,申明你的用意即可。

·4 尾递归优化

  大规模的递归操作有可能发生栈空间溢出错误,这也限制了递归函数的使用,并给系统带来了一定的风险。
而尾递归优化可以有效地避免这种状况。尾递归指递归操作处于函数的最后一步。在这种情况下,该函数的工作其实已经完成(剩余的工作就是再次调用它自己),此时,只需要简单得将中间结果传递给后继调用的递归函数即可。此时,编译器就可以进行一种优化,使当前的函数调用返回,或者用新函数的帧栈覆盖老函数的帧栈。总之,当递归处于函数操作的最后一步时,我们总是可以想方设法避免递归操作不断申请栈空间。

·5 不变模式

  所谓不变,是指对象在创建后,就不再发生变化。

·6 易于并行

  由于对象都处于不变的状态,因此函数式编程更加易于并行。

·7 更少的代码

        //使用传统的编程,会改变对象的状态
int[] arr= {,,,,};
for(int i=;i<arr.length;i++) {
System.out.print(arr[i]+=);
//
}
System.out.println();
for(int i=;i<arr.length;i++) {
System.out.print(arr[i]);
//23456,当下一次获取元素时,状态已经被改变
}
//使用函数式编程,不会改变对象的状态
int[] arr1= {,,,,};
Arrays.stream(arr1).map(x -> x+=).forEach(System.out::print);//
Arrays.stream(arr1).forEach(System.out::print);//12345,当下一次获取元素时,状态还是最初值
int[] arr2 = Arrays.stream(arr1).map(x -> x+=).toArray();//可以把arr1修改后的数据取出来,arr1还是当初的值
Arrays.stream(arr2).forEach((a)-> System.out.print(a));//

http://yuedu.baidu.com/ebook/f7c46708a26925c52cc5bff4.html?f=read