欢迎来到天天文库
浏览记录
ID:39549952
大小:137.50 KB
页数:19页
时间:2019-07-06
《Java Lambda表达式初探》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JavaLambda表达式初探前言本文受启发于TrishaGee在JavaOne2016的主题演讲RefactoringtoJava8。Java8已经发行两年多,但很多人仍然在使用JDK7。对企业来说,技术上谨慎未必是坏事,但对个人学习而言,不去学习新技术就很可能被技术抛弃。Java8一个重要的变更是引入Lambda表达式(lambdaexpression),这听起来似乎很牛,有种我虽然不知道Lambda表达式是什么,但我仍然觉得很厉害的感觉。不要怕,具体到语言层面上Lambda表达式不过是一种新的语法而已,有了它,Java将开启函数式编程的大门。为什么需要Lambda表达式不要纠结
2、什么是Lambda表达式、什么是函数式编程。先来看一下Java8新的语法特性带来的便利之处,相信你会过目不忘的。在有Lambda表达式之前,要新建一个线程,需要这样写:newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("Threadrun()");}}).start();有Lambda表达式之后,则可以这样写:newThread(()->System.out.println("Threadrun()")).start();正如你所见,之前无用的模板代码不见了!如上所示,Lambda表达式一个常见的用
3、法是取代(某些)匿名内部类,但Lambda表达式的作用不限于此。Lambda表达式的原理刚接触Lambda表达式可能觉得它很神奇:不需要声明类或者方法的名字,就可以直接定义函数。这看似是编译器为匿名内部类简写提供的一个小把戏,但事实上并非如此,Lambda表达式实际上是通过invokedynamic指令来实现的。先别管这么多,下面是Lambda表达式几种可能的书写形式,“看起来”并不是很难理解。Runnablerun=()->System.out.println("HelloWorld");//1ActionListenerlistener=event->System.out.pri
4、ntln("buttonclicked");//2RunnablemultiLine=()->{//3System.out.println("Hello");System.out.println("World");};BinaryOperatoradd=(Longx,Longy)->x+y;//4BinaryOperatoraddImplicit=(x,y)->x+y;//5通过上例可以发现:Lambda表达式是有类型的,赋值操作的左边就是类型。Lambda表达式的类型实际上是对应接口的类型。Lambda表达式可以包含多行代码,需要用大括号把代码块括起来,就像
5、写函数体那样。大多数时候,Lambda表达式的参数表可以省略类型,就像代码2和5那样。这得益于javac的类型推导机制,编译器可以根据上下文推导出类型信息。表面上看起来每个Lambda表达式都是原来匿名内部类的简写形式,该内部类实现了某个函数接口(FunctionalInterface),但事实比这稍微复杂一些,这里不再展开。所谓函数接口是指内部只有一个接口函数的接口。Java是强类型语言,无论有没有显式指明,每个变量和对象都必须有明确的类型,没有显式指定的时候编译器会尝试确定类型。Lambda表达式的类型就是对应函数接口的类型。Lambda表达式和StreamLambda表达式的另
6、一个重要用法,是和Stream一起使用。Streamisasequenceofelementssupportingsequentialandparallelaggregateoperations。Stream就是一组元素的序列,支持对这些元素进行各种操作,而这些操作是通过Lambda表达式指定的。可以把Stream看作JavaCollection的一种视图,就像迭代器是容器的一种视图那样(但Stream不会修改容器中的内容)。下面例子展示了Stream的常见用法。例子1假设需要从一个字符串列表中选出以数字开头的字符串并输出,Java7之前需要这样写:Listlist=
7、Arrays.asList("1one","two","three","4four");for(Stringstr:list){if(Character.isDigit(str.charAt(0))){System.out.println(str);}}而Java8就可以这样写:Listlist=Arrays.asList("1one","two","three","4four");list.stream()//1.得到容器的Steam.f
此文档下载收益归作者所有