Microsoft Word - 第3章.doc

Similar documents
エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

软件工程文档编制

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

新・解きながら学ぶJava

chap07.key

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入


OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

什么是函数式编程?

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B,

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

无类继承.key

山东建筑大学学分制管理规定(试行)

電機工程系認可證照清單 /7/1

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Chapter 9: Objects and Classes

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题



KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Microsoft Word - 新1-12.doc

( 总 第 1073 期 ) 浙 江 省 人 民 政 府 主 办 2015 年 3 月 17 日 出 版 省 政 府 令 省 政 府 文 件 目 录 浙 江 省 大 型 群 众 性 活 动 安 全 管 理 办 法 ( 浙 江 省 人 民 政 府 令 第 333 号 ) (3) 浙 江 省 人 民 政

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

1.5招募说明书(草案)

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

《大话设计模式》第一章

避孕篇

Microsoft Word - 01.DOC

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Java

untitled

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

Chapter 9: Objects and Classes

Microsoft Word - 三方协议书与接收函的相关说明学生版.doc

邻居啊 第二天 对门却悄无声息了 莫非昨夜的吵闹 仅是个幻觉 夜幕拉下时 寒风又吱溜溜地叫个不停 老婆 睡下后 我这只夜猫子 继续兴致勃勃地跟着福尔 摩斯去探案 白天的喧嚣退去了 周围格外安静 正 是读书的好时候 突然 响起了钟摆声 哒 哒 哒 节奏匀称 不疾不徐 声响却愈来愈大 格外突兀 了 原来

<4D F736F F D BAC520CAD7B6BCCAA6B7B6B4F3D1A C4EAD7A8D2B5BCBCCAF5D6B0CEF1C6C0C6B8B9A4D7F7D2E2BCFB2E646F63>

其 他 方 面 也 可 以 采 用 同 样 的 方 式, 这 样 又 可 以 锻 炼 除 语 文 方 面 的 其 他 能 力 了 而 英 语 方 面, 我 认 为 配 合 英 语 专 业 举 办 英 语 演 讲 比 赛 就 很 不 错 这 样 开 展 一 系 列 的 创 新 活 动, 锻 炼 多 方

第 六 条 办 法 第 五 条 ( 三 ) 协 会 考 评, 考 评 指 考 核 评 价 第 七 条 办 法 第 六 条 职 业 操 守 包 括 的 内 容 : 个 人 诚 信 不 做 假 账 不 偷 漏 税 不 贪 污 盗 窃 等 第 八 条 企 业 财 务 管 理 人 才 评 价 实 行 五 星

<4D F736F F D A67EABD7A4BAB3A1B1B1A8EEA8EEABD7A6DBA6E6B5FBA6F4AD70B5652E646F63>

统计工作情况汇报

他 随 身 带 有 二 三 十 张 古 方, 白 天 卖 药, 夜 晚 将 药 材 精 细 研 末, 按 方 配 制 对 于 病 人 服 药 后 反 应, 特 别 留 心 发 现 问 题, 就 近 向 老 医 生 老 药 贩 虚 心 求 教, 千 方 百 提 高 药 效 同 时 对 于 春 夏 秋

目 录 第 一 章 地 方 陪 同 导 游 人 员 服 务 程 序...1 第 一 节 地 方 陪 同 导 游 人 员 的 概 念 与 职 责...1 第 二 节 服 务 准 备...2 一 熟 悉 接 待 计 划...2 二 落 实 接 待 事 宜...5 三 物 质 和 知 识 的 准 备...

走 吧, 到 三 峡 去 : 那 里 是 我 们 先 人 用 生 命 之 血 打 造 的 家 园 走 吧, 到 三 峡 去 : 那 里 的 浪 涛 承 载 过 千 百 万 只 我 们 先 人 驶 向 今 天 的 航 船 走 吧, 到 三 峡 去 : 那 里 的 每 一 座 青 山 都 刻 满 了 我

6寸PDF生成工具

Microsoft Word - 送報伕2.doc

Microsoft Word - N011 斷翅天使

中 国 科 学 院 国 家 科 学 图 书 馆

申论写作套路万能模板

申 请 律 师 执 业 许 可 初 审 服 务 指 南 目 录 一 办 理 要 素 ( 一 ) 事 项 名 称 和 编 码 4 ( 二 ) 实 施 机 构 4 ( 三 ) 申 请 主 体 4 ( 四 ) 受 理 地 点 4 ( 五 ) 办 理 依 据 4 ( 六 ) 办 理 条 件 5 ( 七 )

( 地 ( ) 组 织 机 构 代 码 企 业 详 细 名 称 哈 密 地 伊 吾 新 疆 广 汇 新 能 源 有 限 公 司 玛 纳 斯 玛 纳 斯 祥 云 化 纤 有 限 公 司 玛 纳 斯 玛 纳 斯 澳 洋 科 技 有 限 责

图 文 聚 焦 国 培 计 划 (2013) 甘 肃 省 农 村 小 学 音 乐 骨 干 教 师 短 期 集 中 培 训 9 月 4 日 开 班 了, 学 员 老 师 们 从 甘 肃 省 各 个 县 市 州 汇 聚 湖 南 一 师, 开 始 了 为 期 14 天 的 培 训 学 习 : 鲜 明 的

申請機構基本資料

申請機構基本資料

环 境, 我 在 巩 固 在 校 期 间 所 学 习 的 理 论 知 识 的 同 时, 不 断 的 充 实 己, 利 用 业 余 时 间 主 动 学 习 专 业 知 识, 技 能, 把 理 论 联 系 到 工 作 实 践 中 作 为 一 名 工 作 生 活 中 的 党 员, 我 始 终 注 意 与

附件1

~2~

,,

untitled

Guava学习之Resources

EJB-Programming-4-cn.doc

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

三种方法实现Hadoop(MapReduce)全局排序(1)

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

javaexample-02.pdf

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

OOP with Java 通知 Project 3: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

untitled

IoC容器和Dependency Injection模式.doc

EJB-Programming-3.PDF

校园之星

第一部分:前言

Microsoft PowerPoint - ch6 [相容模式]

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

Microsoft Word - Broker.doc

在Spring中使用Kafka:Producer篇

82 於 2006 年 5 月, 亞 洲 發 展 銀 行 和 經 濟 發 展 合 作 組 織 聯 合 舉 辦 亞 太 區 反 貪 污 行 動 的 第 八 屆 指 導 小 組 會 議 中, 採 納 了 亞 太 區 控 制 政 府 採 購 的 貪 污 首 次 專 題 複 審 的 最 後 報 告 當 時,

JavaIO.PDF

e bug 0 x=0 y=5/x 0 Return 4 2

Microsoft Word - ch04三校.doc

呐喊

Microsoft PowerPoint - 10 模板 Template.pptx

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Microsoft PowerPoint - plan08.ppt

extend

Guava学习之CharSequenceReader

Chapter12 Derived Classes

《C语言程序设计》第2版教材习题参考答案

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

untitled

untitled

Transcription:

第 3 章 lambda 表达式及其应用 lambda 表达式是 Java 8 提供的一种新特性, 它使得 Java 也能像 C# 和 C++ 语言一样进行简单的 函数式编程, 这不仅简化了某些通用结构的实现方式, 也大大增强了 Java 语言的表达功能 3.1 lambda 表达式简介 lambda 表达式是基于数学中的 λ 演算得名, 本质上就是一个没有方法名的匿名方法 例如, 有一个方法定义如下 : int myx(int x,int y) { return x*y+10; 这个方法如果用 λ 表达式可以表示为 : (int x, int y) -> x*y+10; 表 3-1 给出了几个简单的 lambda 表达式示例 表 3-1 lambda 表达式示例 lambda 表达式说明等价的方法实现 () > System.out.print ("Example!") (double x) > x/2.0 或 (x) > x/2.0 或 x > x/2.0 (int x,int y) > x*y+10 或 (x,y) > x*y+10 不带任何形参 带有 1 个 double 类型的形参, 形参的类型及括号均可省略, 返回 double 类型 带有 2 个 int 类型的形参, 形参的类型可省略, 返回 int 类型 void myprint(){ System.out.print("Example!"); double myx() { return x=x/2.0; int myx(int x,int y) { return x*y+10; 1.lambda 表达式的格式 lambda 表达式通常以 (argument) >(body) 这样的格式书写, > 被称为 lambda 运算符或箭头运算符, 具体有两种形式 (1)(arg1, arg2 ) > {body // 省略参数类型 (2)(Type1 arg1, Type2 arg2 ) >{body // 指定参数类型在 lambda 表达式中, 参数可以是零个或多个 ; 参数类型可指定, 可省略, 若参数类型

Java 技术及应用 ( 第 2 版 ) 74 省略,Java 编译器会根据表达式的上下文推导出参数的类型 ; 表达式主体 body 可以是 0 条或多条语句, 包含在花括号中 ; 当表达式主体只有一条语句时, 花括号可省略 2.lambda 表达式的类型 lambda 表达式的类型指的就是其返回值的类型 lambda 表达式的返回值类型不必明确指出, 但它可以是 Java 中任何有效的类型 当表达式主体有一条以上语句时, 表达式的返回类型与代码块的返回类型一致 ; 当表达式只有一条语句时, 表达式的返回类型与该语句的返回类型一致 3.2 lambda 表达式应用 lambda 表达式不是独立执行的, 而是经常被应用在函数式接口定义的抽象方法实现中 先来介绍一下函数式接口 1. 函数式接口 (functional interface) 函数式接口是只包含有一个抽象方法的接口, 又被称为单例抽象类 (SAM:Single Abstract Method) 接口 例如,Java 标准库中的 java.lang.runnable 定义为 : public interface Runnable { void run(); 该接口中只包含有一个抽象方法 run(), 所以是一个典型的函数式接口 函数式接口中的抽象方法指明了接口的目标用途 定义了函数式接口之后, 就可以把 lambda 表达式赋值给该接口的一个引用,lambda 表达式定义了函数式接口声明的抽象方法的行为 当通过接口引用调用该方法时, 就会自动创建实现了函数式接口的一个类的实例, 并执行 lambda 表达式所定义的类的行为 例 3.1 的程序定义了一个函数式接口, 如果不用 lambda 表达式, 用传统方法来表达该接口的 4 种不同情况的实现的话, 就需要定义 4 个不同的类来实现接口中的方法 例 3.1 传统方法示例 double compute(double x,double y); // 函数式接口 // 唯一的抽象方法 class myimple1 implements myinter{ // 实现类 1 public double compute(double x,double y){ // 抽象方法的第 1 种实现 return x+y; class myimple2 implements myinter{ // 实现类 2 public double compute(double x,double y){ // 抽象方法的第 2 种实现 return x-y;

class myimple3 implements myinter{ // 实现类 3 public double compute(double x,double y){ // 抽象方法的第 3 种实现 return x*y; class myimple4 implements myinter{ // 实现类 4 public double compute(double x,double y){ // 抽象方法的第 4 种实现 return x/y; public class nolambdatest{ myimple1 add=new myimple1(); System.out.println("90.0 和 5.0 两个数求和, 结果为 :"+add.compute(90.0, myimple2 subtract=new myimple2(); System.out.println("90.0 和 5.0 两个数求差, 结果为 :"+subtract.compute(90.0, myimple3 multiply=new myimple3(); System.out.println("90.0 和 5.0 两个数求积, 结果为 :"+multiply.compute(90.0, myimple4 divide=new myimple4(); System.out.println("90.0 和 5.0 两个数求商, 结果为 :"+divide.compute(90.0, 程序的运行结果如图 3-1 所示 图 3-1 例 3.1 的运行结果 例 3.1 的程序功能如果用 lambda 表达式来实现, 就会比较简洁, 也容易理解, 见例 3.2 例 3.2 lambda 表达式示例 double compute(double x,double y); // 函数式接口 // 唯一的抽象方法 科 lambda 表达式及其应用 75 第 3 章

Java 技术及应用 ( 第 2 版 ) 76 class lambdatest1{ myinter add=(m,n)->m+n; //lambda 表达式赋值给该接口的一个引用 System.out.println("90.0 和 5.0 两个数求和, 结果为 :"+add.compute(90.0, myinter subtract=(m,n)->m-n; //lambda 表达式赋值给该接口的一个引用 System.out.println("90.0 和 5.0 两个数求差, 结果为 :"+subtract.compute(90.0, myinter multiply=(m,n)->m*n; //lambda 表达式赋值给该接口的一个引用 System.out.println("90.0 和 5.0 两个数求积, 结果为 :"+multiply.compute(90.0, myinter divide=(m,n)->m/n; //lambda 表达式赋值给该接口的一个引用 System.out.println("90.0 和 5.0 两个数求商, 结果为 :"+divide.compute(90.0, 程序的运行结果与例 3.1 相同 注意 : 使用 lambda 表达式时, 函数式接口所定义的抽象方法的类型必须与 lambda 表达式的类型兼容, 如果不兼容, 就会导致编译出错 2. 泛型函数式接口在实际应用中, 与 lambda 表达式关联的函数式接口也有可能是泛型的 在这种情况下, lambda 表达式的目标类型部分由声明函数式接口引用时指定的实参类型来决定 例 3.3 说明了 lambda 表达式在泛型函数式接口中的应用 例 3.3 lambda 表达式在泛型函数式接口中的应用示例 interface myinter<t>{ T compute(t x,t y); // 泛型函数式接口 class lambdatest2{ myinter<integer> add1=(m,n)->m+n; // 指定 lambda 表达式中的参数为 int 类型 System.out.println("90 和 5 两个数求和, 结果为 :"+add1.compute(90,5)); myinter<double> add2=(m,n)->m+n; // 指定 lambda 表达式中的参数为 double 类型 System.out.println("90.0 和 5.0 两个数求和, 结果为 :"+add2.compute(90.0, myinter<integer> subtract1=(m,n)->m-n; System.out.println("90 和 5 两个数求差, 结果为 :"+subtract1.compute(90,5)); myinter<double> subtract2=(m,n)->m-n; System.out.println("90.0 和 5.0 两个数求差, 结果为 :"+subtract2.compute(90.0,

myinter<integer> multiply1=(m,n)->m*n; System.out.println("90 和 5 两个数求积, 结果为 :"+multiply1.compute(90,5)); myinter<double> multiply2=(m,n)->m*n; System.out.println("90.0 和 5.0 两个数求积, 结果为 :"+multiply2.compute(90.0, myinter<integer> divide1=(m,n)->m/n; System.out.println("90 和 5 两个数求商, 结果为 :"+divide1.compute(90,5)); myinter<double> divide2=(m,n)->m/n; System.out.println("90.0 和 5.0 两个数求商, 结果为 :"+divide2.compute(90.0, 程序的运行结果如图 3-2 所示 图 3-2 例 3.3 的运行结果 3.3 方法引用 学习完 lambda 表达式之后, 通常会使用 lambda 表达式来创建匿名方法 但是, 某些情况下 lambda 表达式里面可能仅仅只有一个方法调用 在这种情况下, 可以不用 lambda 表达式, 而直接通过方法名称来引用方法, 这就是方法引用 (Method References) 方法引用是 Java 8 新增的语言特性, 也是一种更简洁易懂的 lambda 表达式 方法引用的标准形式是 : classname::methodname 类名 (classname) 与方法名 (methodname) 之间用 :: 隔开, 该符号也是 Java 8 新增的分隔符 表 3-2 列出了常见的 4 种形式的方法引用 表 3-2 类型静态方法的方法引用某个对象的实例方法的方法引用某个类型的任意对象的实例方法的方法引用构造方法的方法引用 方法引用的类型语法格式 ContainingClass::staticMethodName ContainingObject::instanceMethodName ContainingType::methodName ClassName::new 科 lambda 表达式及其应用 77 第 3 章

Java 技术及应用 ( 第 2 版 ) 78 1. 静态方法的方法引用例 3.4 说明了静态方法的方法引用所使用的情形 例 3.4 静态方法的方法引用示例 void test(int x,int y); class mycompare{ static void compare(int m, int n){ if (m<n) System.out.println(" 经过比较可知 :"+m+" < "+n); if (m>n) System.out.println(" 经过比较可知 :"+m+" > "+n); if (m==n) System.out.println(" 经过比较可知 :"+m+" == "+n); static void isdivided(int m, int n){ if (m%n==0) System.out.println(m+" 可以被 "+n+" 整除!"); else System.out.println(m+" 不可以被 "+n+" 整除!"); class methodrefertest1{ static void comptest(myinter p, int op1,int op2){ p.test(op1,op2); comptest(mycompare::compare,16,8); // 引用静态方法 compare comptest(mycompare::isdivided,16,8); // 引用静态方法 isfactor 程序的运行结果如图 3-3 所示 图 3-3 例 3.4 的运行结果 2. 实例方法的方法引用例 3.5 说明了实例方法的方法引用所使用的情形 例 3.5 某个对象的实例方法的方法引用示例 void test(int x,int y); class mycompare{

void compare(int m, int n){ if (m<n) System.out.println(" 经过比较可知 :"+m+" < "+n); if (m>n) System.out.println(" 经过比较可知 :"+m+" > "+n); if (m==n) System.out.println(" 经过比较可知 :"+m+" == "+n); void isdivided(int m, int n){ if (m%n==0) System.out.println(m+" 可以被 "+n+" 整除!"); else System.out.println(m+" 不可以被 "+n+" 整除!"); class methodrefertest2{ mycompare compare1=new mycompare(); myinter m1=compare1::compare; // 通过对象进行实例方法的方法引用 m1.test(30,15); mycompare compare2=new mycompare(); myinter m2=compare2::isdivided; // 通过对象进行实例方法的方法引用 m2.test(30,15); 程序的运行结果如图 3-4 所示 图 3-4 例 3.5 的运行结果 例 3.5 展示的是通过对象进行实例方法的方法引用的情形, 实际应用中还可能会遇到另外的情形 : 例如, 指定一个实例方法, 想使其能够用于给定类的任何对象, 而不是某些已经指定了的对象, 例 3.6 说明了这方面的应用 例 3.6 某个类型的任意对象的实例方法的方法引用示例 void test(mytest mt); class mytest{ private int m,n; mytest(int op1,int op2){ m=op1; n=op2; void compare(){ if (m<n) System.out.println(" 经过比较可知 :"+m+" < "+n); if (m>n) System.out.println(" 经过比较可知 :"+m+" > "+n); 79 第 3 章 科 lambda 表达式及其应用

Java 技术及应用 ( 第 2 版 ) 80 if (m==n) System.out.println(" 经过比较可知 :"+m+" == "+n); void isdivided(){ if (m%n==0) System.out.println(m+" 可以被 "+n+" 整除!"); else System.out.println(m+" 不可以被 "+n+" 整除!"); class methodrefertest3{ mytest mt1=new mytest(30,15); myinter m1=mytest::compare; //mytest 类型的任意对象的实例方法的方法引用 m1.test(mt1); mytest mt2=new mytest(20,6); myinter m2=mytest::isdivided; //mytest 类型的任意对象的实例方法的方法引用 m2.test(mt2); 程序的运行结果如图 3-5 所示 图 3-5 例 3.6 的运行结果 3. 构造方法的方法引用与创建一般的方法引用类似, 也可以创建构造方法的方法引用, 例 3.7 说明了构造方法的方法引用所使用的情形 例 3.7 构造方法的方法引用示例 mytest test(int op1,int op2); class mytest{ private int m,n; mytest(int op1,int op2){ m=op1; n=op2; int getm(){return m; int getn(){return n; class methodrefertest4{ myinter m1=mytest::new; // 构造方法的方法引用

mytest mt1=m1.test(20,6); System.out.println("The value of m in class mytest is:"+mt1.getm()); System.out.println("The value of n in class mytest is:"+mt1.getn()); 程序的运行结果如图 3-6 所示 图 3-6 例 3.7 的运行结果 3.4 小结 本章介绍了 Java 8 提供的一种新特性 lambda 表达式, 并且举例说明了其在函数式接口中的应用 ; 同时还分多种情形讲解了与 lambda 表达式相关的方法引用的使用 习题 3 1. 什么是 lambda 表达式? 2. 什么是函数式接口? 3. 举例说明 lambda 表达式和函数式接口是如何关联的 4. 什么是方法引用? 5. 举例说明方法引用和 lambda 表达式有何关联 81 第 3 章 科 lambda 表达式及其应用