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函数式编程概念的主要内容,如果未能解决你的问题,请参考以下文章

Java1.8函数式接口编程结合泛型简单使用案例demo

Java1.8新特性

java1.8函数式接口

java1.8新特性

java1.8新特性

Java1.8 ​lamda+方法引用 + 函数式接口