虽然JVM有着Scala 、Groovy 、Clojure 等依赖于JVM的函数语式语言,但直到Java8才算是java正式支持函数式编程; Java8中加入了Lambda的支持标志着Java正式加入了混合式编程语言(支持命令式编程与函数式编程)的行列;像C#、Python都是同时支持两种编程范式,近年来函数式编程愈演愈烈,大有命令式编程向函数式编程靠拢的趋势; 命令式编程与函数式编程的最基本区别在于使用的计算模型的不同,命令式编程是基于图灵机的,而函数式编程使用的是lambda演算; 有了lambda的支持使用Java8可以写出可读性更高的代码,减少代码的繁杂度、传递行为等;
比较像之前我们实现一个接口的时候可以使用匿名内部类的方式,先看下匿名内部类实现:
Runnable PRimitive=new Runnable() { @Override public void run() { System.out.println("inner class"); } };
lambda的实现: Runnable lambda = ()-> System.out.println(" lambda "); 比较两种实现方式lambda的简洁程度是匿名内部类没法比的,lambda实现可以理解为传递行为给Runnable,而匿名内部类则是现实了Runnable接口;是不是lambda可以代替匿名内部类出现在所有地方呢? 答案不是的。 Lambda只能代替内部类出现在的接口为函数接口(FunctionalInterface)的地方。
语法 lambda语法: () -> {} 1、 ()里面为函数接口的参数,{} 与要传递到函数接口的语句; 2、 lambda方式如果有多条语句还可以用{ 括号括起来; 3、 如只有一条语句则可以省略{},函数接口存在返回值当->后面只有单条语句时return可以省略,如有多条语句则需要显示return返回该值;
函数接口(Functionalnterface):只定义一个抽象方法的接口默认为函数接口,接口中可以有default方法和static方法,;
简单应用//实现x+y相加 BinaryOperator<Integer> addOperator = (x, y) -> x+y; System.out.println(addOperator.apply(3,4));
Java8中除了在Runnable、Comparator等以往存在的接口添加了FuncationalInterface注解外还在java.util.function包中新加入了大批FuncatinalInterface接口;使用java.util.function包下面的接口可以大大简化我们的编程;
参考资料: 《Java8函数式编程》
文章首发地址:Solinx http://www.solinx.co/archives/382
新闻热点
疑难解答