• Java实战(第2版)
  • Java实战(第2版)
  • Java实战(第2版)
  • Java实战(第2版)
  • Java实战(第2版)
21年品牌 40万+商家 超1.5亿件商品

Java实战(第2版)

82.9 7.0折 119 全新

库存6件

四川成都
认证卖家担保交易快速发货售后保障

作者(英)拉乌尔-加布里埃尔·乌尔玛(Raoul-Gabriel Urma),(意)马里奥·富斯科(Mario Fusco),(英)艾伦·米克罗夫特(Alan Mycroft)

出版社人民邮电出版社

ISBN9787115521484

出版时间2019-12

装帧平装

开本16开

定价119元

货号1201991240

上书时间2024-07-03

聚合博文书店

十年老店
已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:全新
商品描述
作者简介
拉乌尔-加布里埃尔·乌尔玛(Raoul-Gabriel Urma),剑桥大学计算机科学博士,软件工程师,培训师,现任Cambridge Spark公司CEO。在谷歌、eBay、甲骨文和高盛等大公司工作过,并参与过多个创业项目。活跃在技术社区,经常撰写技术文章,多次受邀在靠前会议上做技术讲座。
马里奥·富斯科(Mario Fusco),Red Hat不错软件工程师,负责oss规则引擎Drools的核心开发。拥有丰富的Java开发经验,曾领导媒体公司、金融部门等多个行业的企业级项目开发。对函数式编程和领域特定语言等有浓厚兴趣,并创建了开放源码库lambdaj。
艾伦·米克罗夫特(Alan Mycroft),剑桥大学计算机实验室计算学教授,剑桥大学罗宾逊学院研究员,欧洲编程语言和系统协会联合创始人,树莓派基金会联合创始人和理事。发表过大约100篇研究论文,指导过20多篇博士论文。他的研究主要关注编程语言及其语义、优化和实施。他与业界联系紧密,曾于学术休假期间在AT&T实验室和英特尔工作,还创立了Codemist公司,该公司设计了最初的ARM C编译器Norcroft。
陆明刚,毕业于四川大学,目前在Dell EMC中国很好研发集团任不错主管工程师,曾任趋势科技中国软件研发中心技术经理,在信息科学和工程领域有十余年的实践和研究经验,拥有多项中国及美国。关注JVM性能调优和大数据及其实践,喜欢挖掘技术背后的内幕并乐此不疲。
劳佳,上海交通大学硕士,现任SAP(美国)不错软件支持顾问。业余爱好语言、数学、设计,英、法双语译者,近年翻译出版了《咨询的奥秘》《很好程序员密码》《计算进化史:改变数学的命运》等书。

目录
第一部分基础知识
第1章Java8、9、10以及11的变化2
1.1为什么要关心Java的变化2
1.2Java怎么还在变4
1.2.1Java在编程语言生态系统中的位置5
1.2.2流处理6
1.2.3用行为参数化把代码传递给方法7
1.2.4并行与共享的可变数据8
1.2.5Java需要演变9
1.3Java中的函数9
1.3.1方法和Lambda作为一等值10
1.3.2传递代码:一个例子11
1.3.3从传递方法到Lambda13
1.4流14
1.5默认方法及Java模块17
1.6来自函数式编程的其他好思想19
1.7小结20
第2章通过行为参数化传递代码22
2.1应对不断变化的需求23
2.1.1初试牛刀:筛选绿苹果23
2.1.2再展身手:把颜色作为参数23
2.1.3第三次尝试:对你能想到的每个属性做筛选24
2.2行为参数化25
2.3对付啰唆30
2.3.1匿名类30
2.3.2第五次尝试:使用匿名类31
2.3.3第六次尝试:使用Lambda表达式32
2.3.4第七次尝试:将List类型抽象化33
2.4真实的例子33
2.4.1用Comparator来排序33
2.4.2用Runnable执行代码块34
2.4.3通过Callable返回结果35
2.4.4GUI事件处理35
2.5小结36
第3章Lambda表达式37
3.1Lambda管中窥豹37
3.2在哪里以及如何使用Lambda40
3.2.1函数式接口40
3.2.2函数描述符42
3.3把Lambda付诸实践:环绕执行模式44
3.3.1第1步:记得行为参数化44
3.3.2第2步:使用函数式接口来传递行为45
3.3.3第3步:执行一个行为45
3.3.4第4步:传递Lambda46
3.4使用函数式接口47
3.4.1Predicate47
3.4.2Consumer47
3.4.3Function48
3.5类型检查、类型推断以及52
3.5.1类型检查52
3.5.2同样的Lambda,不同的函数式接口53
3.5.3类型推断55
3.5.4使用局部变量56
3.6方法引用57
3.6.1管中窥豹57
3.6.2构造函数引用60
3.7Lambda和方法引用实战62
3.7.1第1步:传递代码62
3.7.2第2步:使用匿名类62
3.7.3第3步:使用Lambda表达式62
3.7.4第4步:使用方法引用63
3.8复合Lambda表达式的有用方法63
3.8.1比较器复合64
3.8.2谓词复合64
3.8.3函数复合65
3.9数学中的类似思想66
3.9.1积分66
3.9.2与Java8的Lambda联系起来68
3.10小结68
第二部分使用流进行函数式数据处理
第4章引入流72
4.1流是什么72
4.2流简介76
4.3流与集合78
4.3.1只能遍历一次79
4.3.2外部迭代与内部迭代80
4.4流操作82
4.4.1中间操作83
4.4.2终端操作84
4.4.3使用流84
4.5路线图85
4.6小结85
第5章使用流86
5.1筛选87
5.1.1用谓词筛选87
5.1.2筛选各异的元素87
5.2流的切片88
5.2.1使用谓词对流进行切片88
5.2.2截短流90
5.2.3跳过元素90
5.3映射91
5.3.1对流中每一个元素应用函数91
5.3.2流的扁平化92
5.4查找和匹配95
5.4.1检查谓词是否至少匹配一个元素95
5.4.2检查谓词是否匹配所有元素96
5.4.3查找元素96
5.4.4查找个元素97
5.5归约98
5.5.1元素求和98
5.5.2优选值和最小值100
5.6付诸实践103
5.6.1领域:交易员和交易103
5.6.2解答104
5.7数值流106
5.7.1原始类型流特化107
5.7.2数值范围108
5.7.3数值流应用:勾股数108
5.8构建流111
5.8.1由值创建流111
5.8.2由可空对象创建流111
5.8.3由数组创建流112
5.8.4由文件生成流112
5.8.5由函数生成流:创建无限流113
5.9概述116
5.10小结116
第6章用流收集数据118
6.1收集器简介119
6.1.1收集器用作不错归约119
6.1.2预定义收集器120
6.2归约和汇总121
6.2.1查找流中的优选值和最小值121
6.2.2汇总122
6.2.3连接字符串123
6.2.4广义的归约汇总124
6.3分组127
6.3.1操作分组的元素128
6.3.2多级分组130
6.3.3按子组收集数据131
6.4分区134
6.4.1分区的优势135
6.4.2将数字按质数和非质数分区136
6.5收集器接口138
6.5.1理解Collector接口声明的方法139
6.5.2全部融合到一起143
6.6开发你自己的收集器以获得更好的性能144
6.6.1仅用质数做除数145
6.6.2比较收集器的性能148
6.7小结150
第7章并行数据处理与性能151
7.1并行流152
7.1.1将顺序流转换为并行流52
7.1.2测量流性能154
7.1.3正确使用并行流158
7.1.4高效使用并行流159
7.2分支/合并框架161
7.2.1使用RecursiveTask161
7.2.2使用分支/合并框架的很好做法164
7.2.3工作窃取165
7.3Spliterator166
7.3.1拆分过程167
7.3.2实现你自己的Spliterator168
7.4小结173
第三部分使用流和Lambda进行高效编程
第8章CollectionAPI的增强功能176
8.1集合工厂176
8.1.1List工厂177
8.1.2Set工厂178
8.1.3Map工厂179
8.2使用List和Set180
8.2.1removeIf方法180
8.2.2replaceAll方法181
8.3使用Map181
8.3.1forEach方法182
8.3.2排序182
8.3.3getOrDefault方法183
8.3.4计算模式183
8.3.5删除模式184
8.3.6替换模式185
8.3.7merge方法185
8.4改进的ConcurrentHashMap187
8.4.1归约和搜索187
8.4.2计数188
8.4.3Set视图188
8.5小结188
第9章重构、测试和调试189
9.1为改善可读性和灵活性重构代码189
9.1.1改善代码的可读性190
9.1.2从匿名类到Lambda表达式的转换190
9.1.3从Lambda表达式到方法引用的转换191
9.1.4从命令式的数据处理切换到Stream193
9.1.5增加代码的灵活性193
9.2使用Lambda重构面向对象的设计模式195
9.2.1策略模式196
9.2.2模板方法197
9.2.3观察者模式198
9.2.4责任链模式201
9.2.5工厂模式202
9.3测试Lambda表达式204
9.3.1测试可见Lambda函数的行为204
9.3.2测试使用Lambda的方法的行为205
9.3.3将复杂的Lambda表达式分为不同的方法205
9.3.4高阶函数的测试206
9.4调试206
9.4.1查看栈跟踪206
9.4.2使用日志调试208
9.5小结209
第10章基于Lambda的领域特定语言210
10.1领域特定语言212
10.1.1DSL的优点和弊端212
10.1.2JVM中已提供的DSL解决方案214
10.2现代JavaAPI中的小型DSL217
10.2.1把StreamAPI当成DSL去操作集合219
10.2.2将Collectors作为DSL汇总数据220
10.3使用Java创建DSL的模式与技巧221
10.3.1方法链接224
10.3.2使用嵌套函数226
10.3.3使用Lambda表达式的函数序列228
10.3.4把它们都放到一起230
10.3.5在DSL中使用方法引用232
10.4Java8DSL的实际应用234
10.4.1jOOQ235
10.4.2Cucumber236
10.4.3SpringIntegration238
10.5小结239
第四部分无所不在的Java
第11章用Optional取代null242
11.1如何为缺失的值建模243
11.1.1采用防御式检查减少NullPointerException243
11.1.2null带来的种种问题245
11.1.3其他语言中null的替代品245
11.2Optional类入门246
11.3应用Optional的几种模式248
11.3.1创建Optional对象248
11.3.2使用map从Optional对象中提取和转换值248
11.3.3使用flatMap链接Optional对象249
11.3.4操纵由Optional对象构成的Stream253
11.3.5默认行为及解引用Optional对象254
11.3.6两个Optional对象的组合255
11.3.7使用filter剔除特定的值257
11.4使用Optional的实战示例258
11.4.1用Optional封装可能为null的值259
11.4.2异常与Optional的对比259
11.4.3基础类型的Optional对象,以及为什么应该避免使用它们260
11.4.4把所有内容整合起来260
11.5小结262
第12章新的日期和时间API263
12.1LocalDate、LocalTime、LocalDateTime、Instant、Duration以及Period264
12.1.1使用LocalDate和LocalTime264
12.1.2合并日期和时间265
12.1.3机器的日期和时间格式266
12.1.4定义Duration或Period267
12.2操纵、解析和格式化日期268
12.2.1使用TemporalAdjuster270
12.2.2打印输出及解析日期–时间对象272
12.3处理不同的时区和历法274
12.3.1使用时区274
12.3.2利用和UTC/格林尼治时间的固定偏差计算时区275
12.3.3使用别的日历系统276
12.4小结277
第13章默认方法278
13.1不断演进的API280
13.1.1初始版本的API281
13.1.2第二版API281
13.2概述默认方法283
13.3默认方法的使用模式285
13.3.1可选方法285
13.3.2行为的多继承286
13.4解决冲突的规则289
13.4.1解决问题的三条规则289
13.4.2选择提供了拥有体实现的默认方法的接口290
13.4.3冲突及如何显式地消除歧义291
13.4.4菱形继承问题293
13.5小结294
第14章Java模块系统295
14.1模块化的驱动力:软件的推理295
14.1.1关注点分离295
14.1.2信息隐藏296
14.1.3Java软件296
14.2为什么要设计Java模块系统297
14.2.1模块化的局限性297
14.2.2单体型的JDK298
14.2.3与OSGi的比较299
14.3Java模块:全局视图300
14.4使用Java模块系统开发应用301
14.4.1从头开始搭建一个应用302
14.4.2细粒度和粗粒度的模块化303
14.4.3Java模块系统基础303
14.5使用多个模块304
14.5.1exports子句304
14.5.2requires子句305
14.5.3命名306
14.6编译及打包306
14.7自动模块310
14.8模块声明及子句311
14.8.1requires311
14.8.2exports311
14.8.3requires的传递311
14.8.4exportsto312
14.8.5open和opens312
14.8.6uses和provides313
14.9通过一个更复杂的例子了解更多313
14.10小结314
第五部分提升Java的并发性
第15章CompletableFuture及反应式编程背后的概念316
15.1为支持并发而不断演进的Java318
15.1.1线程以及更高层的抽象319
15.1.2执行器和线程池320
15.1.3其他的线程抽象:非嵌套方法调用322
15.1.4你希望线程为你带来什么324
15.2同步及异步API324
15.2.1Future风格的API326
15.2.2反应式风格的API327
15.2.3有害的睡眠及其他阻塞式操作328
15.2.4实战验证329
15.2.5如何使用异步API进行异常处理330
15.3“线框–管道”模型331
15.4为并发而生的CompletableFuture和结合器332
15.5“发布–订阅”以及反应式编程335
15.5.1示例:对两个流求和337
15.5.2背压341
15.5.3一种简单的真实背压341
15.6反应式系统和反应式编程342
15.7路线图342
15.8小结343
第16章CompletableFuture:组合式异步编程344
16.1Future接口344
16.1.1Future接口的局限性346
16.1.2使用CompletableFuture构建异步应用346
16.2实现异步API347
16.2.1将同步方法转换为异步方法348
16.2.2错误处理350
16.3让你的代码免受阻塞之苦352
16.3.1使用并行流对请求进行并行操作353
16.3.2使用CompletableFuture发起异步请求353
16.3.3寻找更好的方案355
16.3.4使用定制的执行器356
16.4对多个异步任务进行流水线操作358
16.4.1实现折扣服务358
16.4.2使用Discount服务359
16.4.3构造同步和异步操作360
16.4.4将两个CompletableFuture对象整合起来,无论它们是否存在依赖363
16.4.5对Future和Completable-Future的回顾364
16.4.6高效地使用超时机制365
16.5响应CompletableFuture的completion事件366
16.5.1对很好价格查询器应用的优化367
16.5.2付诸实践368
16.6路线图369
16.7小结369
第17章反应式编程370
17.1反应式宣言371
17.1.1应用层的反应式编程371
17.1.2反应式系统373
17.2反应式流以及FlowAPI373
17.2.1Flow类374
17.2.2创建你的个反应式应用377
17.2.3使用Processor转换数据381
17.2.4为什么Java并未提供FlowAPI的实现383
17.3使用反应式库RxJava384
17.3.1创建和使用Observable385
17.3.2转换及整合多个Observable392
第六部分函数式编程以及Java未来的演进
第18章函数式的思考396
18.1实现和维护系统396
18.1.1共享的可变数据397
18.1.2声明式编程398
18.1.3为什么要采用函数式编程399
18.2什么是函数式编程399
18.2.1函数式Java编程400
18.2.2引用透明性402
18.2.3面向对象的编程和函数式编程的对比402
18.2.4函数式编程实战403
18.3递归和迭代405
18.4小结408
第19章函数式编程的技巧409
19.1无处不在的函数409
19.1.1高阶函数410
19.1.2柯里化411
19.2持久化数据结构412
19.2.1破坏式更新和函数式更新的比较413
19.2.2另一个使用Tree的例子415
19.2.3采用函数式的方法416
19.3Stream的延迟计算418
19.3.1自定义的Stream418
19.3.2创建你自己的延迟列表420
19.4模式匹配425
19.4.1访问者模式425
19.4.2用模式匹配力挽狂澜426
19.5杂项429
19.5.1缓存或记忆表429
19.5.2“返回同样的对象”意味着什么430
19.5.3结合器431
19.6小结432
第20章面向对象和函数式编程的混合:Java和Scala的比较433
20.1Scala简介434
20.1.1你好,啤酒434
20.1.2基础数据结构:Li

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP