java1.8函数式编程概念
Posted 胖头猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java1.8函数式编程概念相关的知识,希望对你有一定的参考价值。
有关函数式编程
·1 函数作为一等公民
特点:将函数作为参数传递给另外一个函数;函数可以作为另外一个函数的返回值
·2 无副作用
函数的副作用指的是函数在调用过程中,除了给出了返回值外,还修改了函数外部的状态,比如,函数在调用过程中,修改了某一个全局状态。
显式函数指函数与外界交换数据的唯一渠道就是参数和返回值,显式函数不会去读取或者修改函数的外部状态。与之相对的是隐式函数,隐式函数除了参数和返回值外,还会读取外部信息,或者可能修改外部信息。
·3 申明式的(Declarative)
对于申明式的编程范式,你不在需要提供明确的指令操作,所有的细节指令将会更好的被程序库所封装,你要做的只是提出你要的要求,申明你的用意即可。
·4 尾递归优化
大规模的递归操作有可能发生栈空间溢出错误,这也限制了递归函数的使用,并给系统带来了一定的风险。
而尾递归优化可以有效地避免这种状况。尾递归指递归操作处于函数的最后一步。在这种情况下,该函数的工作其实已经完成(剩余的工作就是再次调用它自己),此时,只需要简单得将中间结果传递给后继调用的递归函数即可。此时,编译器就可以进行一种优化,使当前的函数调用返回,或者用新函数的帧栈覆盖老函数的帧栈。总之,当递归处于函数操作的最后一步时,我们总是可以想方设法避免递归操作不断申请栈空间。
·5 不变模式
所谓不变,是指对象在创建后,就不再发生变化。
·6 易于并行
由于对象都处于不变的状态,因此函数式编程更加易于并行。
·7 更少的代码
//使用传统的编程,会改变对象的状态 int[] arr= {1,2,3,4,5}; for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+=1); //23456 } System.out.println(); for(int i=0;i<arr.length;i++) { System.out.print(arr[i]); //23456,当下一次获取元素时,状态已经被改变 } //使用函数式编程,不会改变对象的状态 int[] arr1= {1,2,3,4,5}; Arrays.stream(arr1).map(x -> x+=1).forEach(System.out::print);//23456 Arrays.stream(arr1).forEach(System.out::print);//12345,当下一次获取元素时,状态还是最初值 int[] arr2 = Arrays.stream(arr1).map(x -> x+=1).toArray();//可以把arr1修改后的数据取出来,arr1还是当初的值 Arrays.stream(arr2).forEach((a)-> System.out.print(a));//23456
以上是关于java1.8函数式编程概念的主要内容,如果未能解决你的问题,请参考以下文章