- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java8新特性讲述
Java8新特性
Java8在使世界上最受欢迎的编程语言之一在接纳函数式编程的过程中向前迈了一大步。为了支持函数式编程,编程语言必须将函数作为第一类对象。在Java8之前,如果没有使用一个匿名内部类模板是没法写出清晰的函数式代码的。随着lambda表达式的引入,函数已经成为第一类对象,并能够像其它变量一样被到处传递。
lambda表达式允许你定义一个不与标识符绑定的匿名函数。你可以像编程语言中的其它概念一样使用它们,比如变量的声明。当一个编程语言需要支持高阶函数时,就需要用到lambda表达式。高阶函数是指以其它函数作为参数或者返回函数作为结果的函数。
这一节的代码在ch02包中
现在,随着在Java8中引进了lambda表达式,Java已经支持高阶函数。让我来看一个lambda表达式的典型例子——Collections类中的sort方法。sort方法有两种变体——一种以一个List作为参数,另一个以List和Comparator作为参数。如下面的代码块所示,第二种sort方法是一个接受lambda表达式的高阶函数的例子。
ListString names = Arrays.asList(shekhar, rahul, sameer);
Collections.sort(names, (first, second) - first.length() - second.length());
1
2
上面的代码将姓名链表按照元素的长度进行排序。该程序的输出如下所示。
[rahul, sameer, shekhar]
1
上面代码块中的表达式(first, second) - first.length() - second.length()是一个ComparatorString类型的lambda表达式。
(first, second)是比较器Comparator的compare方法。
first.length() - second.length() 是用来比较两个名字长度的方法实体。
-是lambda操作符,用来将参数和方法体分离开。
在我们继续深挖Java8的lambda表达式之前,让我们来看看lambda的历史来理解为什么会存在lambda。
lambda的历史
lambda表达式源自λ演算。λ演算由Alonzo Church在将带有函数的符号计算进行公式化时提出。λ演算是具有图灵完备性的,它通过数学形式来展现计算过程。图灵完备性表示你可以通过lambda表达任何的数学计算。
λ演算成为了函数式编程语言的一个坚实的理论基础。很多有名的函数式编程语言,像Haskell和Lisp都是构建在λ演算的基础上的。高阶函数的概念,比如接受其他函数为输入的函数也来自λ演算。
λ演算的核心概念是表达式。一个lambda表达式可以表示为如下形式:
expression := variable | function| application
1
variable–变量就是类似x,y,z的占位符,它们用来表示具体的像1,2之类的值,或者lambda方法。
functrion–这是一个匿名的方法定义,它需要一个变量,并产生另一个lambda表达式。例如,λx.x*x是一个用来计算数的平方的方法。
application–这是将具体的参数应用在函数上的行为。假设你想得到10的平方,那么在λ演算中你会写一个平方函数λx.x*x,并把10代入。这个函数应用将得到(λx.x*x) 10 = 10*10 = 100。你不仅仅能够代入简单的像10一样的值,你可以将一个函数代入另一个函数来得到一个新的函数。例如,(λx.x*x) (λz.z+10)将会生成一个函数λz.(z+10)*(z+10)。现在,你可以用这个函数得到一个数加上10以后的平方。这是一个高阶函数的例子。
现在你理解了λ演算和它在函数式编程语言中的影响。让我们来学习它是如何在Java8中实现的。
在Java8之前传递行为的方式
在Java8之前,唯一能够用来传递行为的方式是通过匿名类。假设你想要在用户完成注册的同时在另一个线程中给该用户发送一封邮件。在Java8之前,你会写出类似下面的代码。
sendEmail(new Runnable() {
@Override
public void run() {
System.out.println(Sending email...);
}
});
sendEmail方法拥有如下的方法签名。
public static void sendEmail(Runnable runnabl
您可能关注的文档
- ISO文件编写教材讲述.ppt
- ISO9001绩效指标KPI讲述.ppt
- 享有受教育的权利1概要.ppt
- ISE8.1全部实验指导书2014-9讲述.doc
- 京沈客专5标监控量测管理实施细则概要.docx
- 京口北固亭怀古好概要.ppt
- 京沈高速公路计重收费设备驱动动态库技术要求v2.0概要.doc
- 京沪高速公路某段大修工程施工组织设计_secret概要.doc
- 享有受教育的权利概要.ppt
- 亮出你的名片——求职简历准备(大学生就业指导课)概要.ppt
- 2024高考物理一轮复习规范演练7共点力的平衡含解析新人教版.doc
- 高中语文第5课苏轼词两首学案3新人教版必修4.doc
- 2024_2025学年高中英语课时分层作业9Unit3LifeinthefutureSectionⅢⅣ含解析新人教版必修5.doc
- 2024_2025学年新教材高中英语模块素养检测含解析译林版必修第一册.doc
- 2024_2025学年新教材高中英语单元综合检测5含解析外研版选择性必修第一册.doc
- 2024高考政治一轮复习第1单元生活与消费第三课多彩的消费练习含解析新人教版必修1.doc
- 2024_2025学年新教材高中英语WELCOMEUNITSectionⅡReadingandThi.doc
- 2024_2025学年高中历史专题九当今世界政治格局的多极化趋势测评含解析人民版必修1.docx
- 2024高考生物一轮复习第9单元生物与环境第29讲生态系统的结构和功能教案.docx
- 2024_2025学年新教材高中英语UNIT5LANGUAGESAROUNDTHEWORLDSect.doc
文档评论(0)