当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为状态变量。
下图是无状态编程:
该函数总是将a加1并返回,不存在任何有变量的东西。
在服务器架构中,我们知道,无状态的服务架构可以支持服务任务扩展,好处多多,同样,编写无状态代码也是如此,因为没有状态,就没有伤害。
不变性:函数输入的数据是不能动的,用java语言举例,入参默认其实是final类型的,不可变。因为改变原有数据是十分危险的事情,也是因为此种思想,函数式编程不会对入参做任务修改,总是返回新的数据。例如下面的java代码例子:version作为函数式接口的变量,是不可变的,因此,在函数式接口后面的version=1.7,编译会报错。
函数可以作为参数传递: 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实现:
jdk8实现:
对比两种实现。jdk7的实现有太多if else 分支嵌套,我们知道,有太多if else分支的代码不是好代码。相比而言,jdk8的编程方式。没有分支逻辑,仅仅一行代码声明,不仅能清晰知道实现的意图。且实现上更为优雅。推荐。
2,需求:获取用户名长度大于5位的用户,返回姓名的List集合List<String>
jdk7实现:
jdk8实现:
通过流式编程,我们清除了很多的if else块,同时程序也正确的处理了null判断。更重要的是,我们不用再新建names这样的临时变量。代码高度封装,并将for循环变成了内部迭代。代码简洁干净,意图明了。函数式编程的优点众多,例如惰性求值,顺序无关,天然并行。将表达如何实现改为了表达如何映射。在此就不在一一例举。请读者自行学习。点击原文外链一篇知乎文章(什么是函数式编程思维)
(完)
chen陈序猿
以上是关于当java8实现了函数式编程的主要内容,如果未能解决你的问题,请参考以下文章