当java8实现了函数式编程

Posted chen陈序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当java8实现了函数式编程相关的知识,希望对你有一定的参考价值。


什么是函数式编程

        函数式编程的概念是相对于声明式编程而言的。在说明什么是函数式编程的时候,先说说什么是函数。

        函数是一个数学概念,代表着一个入参和出参的一种映射。例如:

        y=f(x)

        z=f(x)+1

        z=y+1

        ......

        因此,函数式编程的思想其实就是演化自数学的函数,代表的是一个入参和出参的映射。(mapping),我的入参是什么,对应的出参又是什么。因此,函数式关心的是入参和出参的关系,而不是怎么通过入参得到出参,是一种对行为的抽象。

        函数式编程有以下特点:

        无状态:函数不维护任何状态,你给我什么,我就按照你的映射规则产出什么。你输入的数据我不会变,我只是拿你输入的数据,产生新的数据。 比如,z=y+1,你y传递2 ,z永远都是3。

      下图是有状态编程:a为状态变量。

       下图是无状态编程:

        

当java8实现了函数式编程

      该函数总是将a加1并返回,不存在任何有变量的东西。

       在服务器架构中,我们知道,无状态的服务架构可以支持服务任务扩展,好处多多,同样,编写无状态代码也是如此,因为没有状态,就没有伤害。

       不变性:函数输入的数据是不能动的,用java语言举例,入参默认其实是final类型的,不可变。因为改变原有数据是十分危险的事情,也是因为此种思想,函数式编程不会对入参做任务修改,总是返回新的数据。例如下面的java代码例子:version作为函数式接口的变量,是不可变的,因此,在函数式接口后面的version=1.7,编译会报错。

当java8实现了函数式编程

        函数可以作为参数传递:  var a= finction(x,y);  

 java8中的函数式编程

        首先从函数可以作为参数传递说起。

        在java8中,你可以这么写: 

    FuntionInterface a = public void sayHelloWorld(String s){
System.out.println("hello,world"+s);
}
    其实上面这段代码是无法编译通过的。别急,我们一点一点往函数式编程靠拢。只要去掉一些声明式编程依赖的元素。
  public是无用的声明,应该去掉。

    FuntionInterface a = void sayHelloWorld(String s){
System.out.println("hello,world"+s);
}
    返回值类型我们可以推断出来,不用声明。
    FuntionInterface a = sayHelloWorld(String s){
System.out.println("hello,world"+s);
}
    方法签名和入参也不需要。入参类型编译器会自己推断。
    FuntionInterface a = (s){
System.out.println("hello,world"+s);
}
    使用Lambda的语法。
    FuntionInterface a = (String s)->{
System.out.println("hello,world"+s);
}
只有一行实现。{}可以省略。然后得到了我们的最终结果。我们把一个函数赋值给了一个变量。俗称:lambda表达式。

   FuntionInterface a = (s)->System.out.println("hello,world"+s);

   
其实lambda表达式本身,就是函数式接口的实现。  

    @FunctionalInterface
   public interface FuntionInterface {
       
void doSomeThing(String s);
   }
 
一个lambda映射一个函数式接口,而函数式接口的声明,就能推断出lambda的类型和返回值,因此表达式本身不用写参数类型返回值什么的东西。比如。本例的函数式接口,接受一个字符串,执行一个动作,没有返回值。
java8函数式编程,代码有何改善?
 
java8开始支持函数式编程,这使得程序员能够编写出更加优雅。更加无副作用的代码。
  类库自行研究。这里举一些例子:
  1,需求:获取用户名,转大写,返回。
  jdk7实现:
 

当java8实现了函数式编程

    jdk8实现:
   

当java8实现了函数式编程
   对比两种实现。jdk7的实现有太多if else 分支嵌套,我们知道,有太多if else分支的代码不是好代码。相比而言,jdk8的编程方式。没有分支逻辑,仅仅一行代码声明,不仅能清晰知道实现的意图。且实现上更为优雅。推荐。
   2,需求:获取用户名长度大于5位的用户,返回姓名的List集合List<String>
   jdk7实现:
   

当java8实现了函数式编程

   jdk8实现:
 

    通过流式编程,我们清除了很多的if else块,同时程序也正确的处理了null判断。更重要的是,我们不用再新建names这样的临时变量。代码高度封装,并将for循环变成了内部迭代。代码简洁干净,意图明了。

   函数式编程的优点众多,例如惰性求值,顺序无关,天然并行。将表达如何实现改为了表达如何映射。在此就不在一一例举。请读者自行学习。点击原文外链一篇知乎文章(什么是函数式编程思维)

(完)

chen陈序猿                      

微信ID:echo_陈
长按二维码添加公众号

以上是关于当java8实现了函数式编程的主要内容,如果未能解决你的问题,请参考以下文章

《Java8实战》读书笔记12:函数式编程

函数式编程

Java8的函数式编程怎么样?

学 Java8 函数式编程

编程 | Java8函数式编程入门

包会,教你用Java函数式编程重构烂代码