在软件工程师的职业生涯中,知识的“半衰期”通常为三年,这意味着我们掌握的一半知识在三年后将变得毫无价值。这个行业本身就意味着不断充电与持续学习。
作为使用最广泛的编程语言,Java 的地位一直是不可撼动的。世界上累计有 150 亿台设备运行 Java,全球 Java 开发者的数量超过 1000 万人,Java 程序员更是进可攻前端,退可守后端。
Java 不仅构成了大量开源平台的基础,也已成为软件文化中不可或缺的一部分。在各大编程语言排行榜前三的位置上,你几乎都能找到 Java 的身影。
Java 版本更新的速度更是嗖嗖地。有时候,很难相信一门已保持了 20 年向后兼容性的语言会发生如此巨大的变化。在 Oracle 于 2014 年 3 月发布 Java SE 8 之前,作为最权威的服务器端编程语言,Java 已然赢得“21 世纪的 COBOL”这一美誉。Java 稳定且应用广泛,同时还不遗余力地追求性能。变化来得很慢,但还是来了。正因为如此,每当 Java 发布新版本时,企业的升级意愿并不迫切。
Java 9 面世之后,Oracle 开始加快了这门语言的迭代速度,版本发布周期改为半年一次,以便缩短开发者使用新功能的时间。我们也不难看出 Oracle 意欲求变之心。
不过,在 Java SE 8 发布之后,一切也都发生了改变。Java SE 8 将“ Lambda 项目”(Project Lambda)纳入其中,这个重大的创新将函数式编程(functional programming)的概念引入这门杰出的面向对象语言。lambda 表达式、方法引用以及流从根本上改变了 Java 的习惯用法。自此之后,开发人员一直在努力跟上这门语言前进的步伐。
面对这些新特性,我们无意评判这些变化能否对 Java 开发有所促进,也无意探讨是否可以通过其他途径实现同样的目的。只想说新特性已经存在,我们应该如何利用它们完成工作。通过了解 Java 引入的新特性来帮助自己实现既定目标。
换言之,一旦掌握这种新的程序设计模型,就能享受它所带来的诸多优点。函数式代码往往更简单,而且更易于编写和理解。函数式编程强调不可变性(immutability),这使得编写的并发代码更简洁,调试和运行更容易成功。
在 Java 初登舞台时,摩尔定律仍然有效:处理器的速度大约每 18 个月就提高一倍。而如今性能提升的根本在于,即使是手机也已大部分配备了多个处理器。
由于 Java 非常注重保持向后兼容性,不少企业和开发人员在迁移到 Java SE 8 时并未采用新的习惯用法。即便如此,Java SE 8 仍然是一个值得尝试的强大平台,而且 Oracle 已于 2015 年 4 月正式宣布停止对 Java 7 提供支持。
Java SE 8 发布至今已有几年时间,大部分 Java 开发人员目前都已转向 JDK 8。虽然现在 Java 版本已经到了 Java 10,即便是这样,深入了解 Java SE 8 对未来的开发也是有很大意义的。
最近市场上经常把Python和Java编程语言拿出来进行比较,我们承认Python发展速度确实很快,也是一门很容易上手的编程语言,可是编程语言也是各有各的优缺点,不能因为一门语言的兴起而忽略了其他的编程语言,要不Java为什么总能在编程语言排行榜的前三名呢?说明Java的性能上还是有优点的。也是程序员心里最流行的编程语言。
算起来我们近期一直在推荐Python而忽略了Java的推荐,不过不用担心,这次就给大家介绍一位新朋友——《Java攻略:Java常见问题的简单解法》。新在哪里?新在形式上。全书都是采用一问一答的形式,有 70 余个可以用于实际开发的案例,可以说是理论与实战兼备了。
介绍了如何利用 Java 8 和 Java 9 的新特性解决这些问题,从而以更自然的方式让开发人员对这门语言的变化了然于心。我们可以举一反三,将所学的知识运用到实际开发中。
如果你是一位经验丰富的开发者,基本上无须像初学者一样学习 Java 8 和 Java 9 引入的所有新特性,也没有时间这样做。这本对你来说就是一本迅速查找相关特性介绍的指南,并给出可以用于实际开发的示例。
而书中范例均来自开发人员在日常工作中遇到的问题,还有如何利用 Java 8 和 Java 9 的新特性解决这些问题,从而以更自然的方式让开发人员对这门语言的变化了然于心。我们可以举一反三,将所学的知识运用到实际开发中。
就算你是 Java 8 和 Java 9 的长期使用者,依然可以从中受到启发。有关归约运算符的讨论切实加深了读者对这种函数式编程风格的理解。专门探讨 Java 9 新特性的章节正是开发人员所需要的,对所有希望提高自身知识水平的 Java 开发人员而言,本书可以说非常有用了。
细节展示
作译者简介
作者:肯·寇森(Ken Kousen),独立咨询师与培训讲师,Kousen IT 公司总裁;对 Spring、Hibernate、Groovy、Grails 等语言和框架颇有研究;荣膺 2013 年和 2016 年 JavaOne Rock Star 大奖;毕业于 MIT 并取得了普林斯顿大学博士学位。
译者:蒋楠,毕业于电子科技大学、维多利亚大学,多年来致力于 web 开发与软件架构设计,对算法、数据密集型应用、分布式数据库系统兴趣浓厚。非资深程序员,严肃马拉松跑者。
内容简介
- 第 1 章将介绍 lambda 表达式和方法引用的基础知识,然后讨论接口的新特性,包括默认方法和静态方法。此外,还将定义“函数式接口”,并解释它对于理解 lambda 表达式的重要性。
- 第2章主要介绍 Java 8 引入的 java.util.function 包,它包括 Consumer、Supplier、Predicate 以及 Function 这四类特殊的函数式接口,它们的应用贯穿于整个标准库。
- 第 3 章将介绍流的概念及其表示抽象的方法。流支持对数据进行转换和过滤,而非迭代地进行处理。这一章的范例将讨论与流相关的映射、过滤、归约等概念,它们与第 9 章介绍的并行和并发有密切的关系。
- 第 4 章主要介绍流数据的排序,并讨论如何将其转换为集合。这一章还将介绍分区和分组,它们将一般意义上的数据库操作转换为简单的库调用。
- 第 5 章是综合性的一章。在掌握 lambda 表达式、方法引用以及流的用法之后,读者将学习如何综合运用它们来解决某些有趣的问题。这一章还将讨论惰性、延迟执行、闭包复合等概念,以及异常处理这个令人头疼的问题。
- 第 6 章将讨论 Java 8 引入的颇具争议性的 Optional 类。这一章的范例将介绍 Optional 类的用法,以及如何创建实例并从中提取值。此外,我们将进一步讨论 Optional 类中 map 与 flatMap 操作所体现的函数式概念,以及它们与流中的 map 与 flatMap 操作有何不同。
- 第 7 章将介绍输入 / 输出流(与函数式流相对)的实际应用,以及 Java 8 针对文件和目录处理为标准库引入的一些函数式概念。
- 第 8 章将讨论 Java 8 引入的 Date-Time API,以及它如何取代传统且饱受诟病的 Date 类和 Calendar 类。这种新的 API 基于 Joda-Time 库,凝聚了大量开发人员多年的使用经验,已被重写为 java.time 包。坦率地讲,即便 Date-Time API 是 Java 8 新增的唯一特性,升级到 Java 8 也物有所值。
- 第 9 章主要介绍流模型的一种隐式承诺:通过一次方法调用,可以将串行流转换为并行流,从而充分利用计算机中所有可用的处理器。并发涉及的内容很多,这一章将重点介绍 Java 库的新增功能,这些功能便于用户进行试验,并评估成本和收益是否值得付出努力。
- 第 10 章将介绍 Java 9 引入的众多新特性,该版本于 2017 年 9 月 21 日正式发布。Jigsaw 本身的内容已可单独成书,但其基础概念十分清晰,这一章将对此进行介绍。其他范例将讨论接口中的私有方法,并介绍 Stream、Collectors 与 Optional 新增的各种方法,以及如何创建日期流 1。
目
第1章 基础知识 1
1.1 lambda表达式 2
1.2 方法引用 5
1.3 构造函数引用 8
1.4 函数式接口 12
1.5 接口中的默认方法 14
1.6 接口中的静态方法 17
第2章 java.util.function包 20
2.1 Consumer接口 20
2.2 Supplier接口 22
2.3 Predicate接口 25
2.4 Function接口 28
第3章 流式操作 31
3.1 流的创建 31
3.2 装箱流 35
3.3 利用reduce方法实现归约操作 36
3.4 利用reduce方法校验排序 44
3.5 利用peek方法对流进行调试 45
3.6 字符串与流之间的转换 47
3.7 获取元素数量 50
3.8 汇总统计 52
3.9 查找流的第一个元素 54
3.10 使用anyMatch、allMatch与noneMatch方法 58
3.11 使用flatMap与map方法 60
3.12 流的拼接 63
3.13 惰性流 66
第4章 比较器与收集器 69
4.1 利用比较器实现排序 69
4.2 将流转换为集合 72
4.3 将线性集合添加到映射 75
4.4 对映射排序 77
4.5 分区与分组 79
4.6 下游收集器 81
4.7 查找最大值和最小值 83
4.8 创建不可变集合 85
4.9 实现Collector接口 87
第5章 流式操作、lambda表达式与方法引用的相关问题 91
5.1 java.util.Objects类 91
5.2 lambda 表达式与效果等同于final的变量 93
5.3 随机数流 96
5.4 Map接口的默认方法 97
5.5 默认方法冲突 101
5.6 集合与映射的迭代 103
5.7 利用Supplier创建日志消息 105
5.8 闭包复合 107
5.9 利用提取的方法实现异常处理 110
5.10 受检异常与lambda表达式 112
5.11 泛型异常包装器的应用 114
第6章 Optional类 117
6.1 Optional的创建 118
6.2 从Optional中检索值 120
6.3 getter 和setter方法中的Optional 122
6.4 Optional.flatMap与Optional.map方法 124
6.5 Optional的映射 127
第7章 文件I/O 131
7.1 文件处理 132
7.2 以流的形式检索文件 134
7.3 文件系统的遍历 135
7.4 文件系统的搜索 137
第8章 java.time包 139
8.1 Date-Time API中的基本类 140
8.2 根据现有实例创建日期和时间 143
8.3 调节器与查询 147
8.4 将java.util.Date转换为java.time.LocalDate 152
8.5 解析与格式化 155
8.6 查找具有非整数小时偏移量的时区 158
8.7 根据UTC偏移量查找地区名 160
8.8 获取事件之间的时间 162
第9章 并行与并发 165
9.1 将顺序流转换为并行流 166
9.2 并行流的优点 169
9.3 调整线程池大小 173
9.4 Future接口 175
9.5 完成CompletableFuture 178
9.6 多个CompletableFuture之间的协调(第1部分) 181
9.7 多个CompletableFuture之间的协调(第2部分) 186
第10章 Java 9新特性 193
10.1 Jigsaw中的模块 194
10.2 接口中的私有方法 198
10.3 创建不可变集合 200
10.4 新增的Stream 方法 204
10.5 下游收集器:filtering与flatMapping 207
10.6 新增的Optional方法 210
10.7 日期范围 212
java学习资料获取方式:
私信不要多字,不要少字,不要错字,私信方法:点击我头像,进入主页面,右上角有私信功能,在关注的上方位置。
閱讀更多 y奈何k 的文章