Java8新特性之Lambda表达式浅析
说到java8,首先会想到lambda(闭包)以及虚拟扩展方法(defaultmethod),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java8系列开篇要讲的第一特性(JEP126http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java8新特性有着重要的意义。
一、函数式接口
函数式接口(functionalinterface也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。java8提供@FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断,但最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。
Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现,下面讲到语法会讲到
二、Lambda语法
包含三个部分
1.一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数
2.一个箭头符号:->
3.方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}
总体看起来像这样:
(parameters)->expression或者(parameters)->{statements;}
看一个完整的例子,方便理解
/** *测试lambda表达式 * *@authorbenhail */ publicclassTestLambda{
publicstaticvoidrunThreadUseLambda(){ //Runnable是一个函数接口,只包含了有个无参数的,返回void的run方法; //所以lambda表达式左边没有参数,右边也没有return,只是单纯的打印一句话 newThread(()->System.out.println("lambda实现的线程")).start(); }
publicstaticvoidrunThreadUseInnerClass(){ //这种方式就不多讲了,以前旧版本比较常见的做法 newThread(newRunnable(){ @Override publicvoidrun(){ System.out.println("内部类实现的线程"); } }).start(); }
publicstaticvoidmain(String[]args){ TestLambda.runThreadUseLambda(); TestLambda.runThreadUseInnerClass(); } }