Java函数式编程实战
Java函数式编程实战
Ben Weidig
臧秀涛, 郑云飞 译
出版时间:2026年09月(预计)
页数:451(预计)
“函数式范式是Java编程中的一项重大变革,但这并不意味着要完全抛弃面向对象编程。《Java函数式编程实战》是任何希望提高编程技能并与时俱进的程序员的必读书。”
——A N M Bazlur Rahman
软件工程师,Java Champion荣誉得主,技术图书作者,Java用户组负责人

Java开发人员通常通过面向对象编程来解决软件开发的复杂性,但并非所有问题都适合使用面向对象编程来解决。函数式编程范式提供了另一种解决问题的方法,而Java也提供了易于掌握的函数式编程工具,如Lambda表达式和流。如果你有兴趣将函数式编程概念应用到自己的Java代码中,本书将是不二之选。
作者Ben Weidig重点介绍了函数式编程的不同方面,并展示了如何在无需完全转向函数式编程的情况下将其融入自己的代码。你将了解如何、何时以及为何使用函数式编程概念(如不变性和纯函数)来编写更简洁、更合理和更经得起时间考验的代码。许多开发人员希望通过同时使用面向对象编程和函数式编程来扩展自己的视野。这不再是“非此即彼”的选择,而是可以“兼而有之” 。
在本书中,你将:
● 对函数式编程有个较高层次的认识,包括了解Java开发人员已经可以使用的类型
● 探索不同的函数式编程概念并学习如何使用它们
● 学习如何增强你的代码,以及在日常工作中如何使用Java新的函数式特性,而无需完全转向函数式编程
● 培养函数式编程思维并提高自己的编程技能,无论使用何种语言或范式
  1. 前言
  2. 第一部分 函数式编程基础
  3. 第1章 函数式编程简介
  4. 1.1 什么是函数式语言?
  5. 1.2 函数式编程概念
  6. 1.2.1 纯函数和引用透明性
  7. 1.2.2 不可变性
  8. 1.2.3 递归
  9. 1.2.4 一等函数和高阶函数
  10. 1.2.5 函数组合
  11. 1.2.6 柯里化
  12. 1.2.7 偏函数应用
  13. 1.2.8 惰性求值
  14. 1.3 函数式编程的优点
  15. 1.4 函数式编程的缺点
  16. 本章要点
  17. 第2章 函数式的Java
  18. 2.1 什么是Java的Lambda表达式
  19. 2.1.1 Lambda语法
  20. 2.1.2 函数式接口
  21. 2.1.3 Lambda表达式和外部变量
  22. 2.1.4 关于匿名类
  23. 2.2 Lambda表达式实战
  24. 2.2.1 创建Lambda表达式
  25. 2.2.2 调用Lambda表达式
  26. 2.2.3 方法引用
  27. 2.3 Java中的函数式编程概念
  28. 2.3.1 纯函数与引用透明性
  29. 2.3.2 不可变性
  30. 2.3.3 一等公民
  31. 2.3.4 函数组合
  32. 2.3.5 惰性求值
  33. 本章要点
  34. 第3章 JDK的函数式接口
  35. 3.1 四大类函数式接口
  36. 3.1.1 函数型接口
  37. 3.1.2 消费型接口
  38. 3.1.3 供应型接口
  39. 3.1.4 谓词型接口
  40. 3.2 为什么会有这么多函数式接口变体
  41. 3.2.1 函数元数
  42. 3.2.2 用于基本类型的函数式接口
  43. 3.2.3 桥接函数式接口
  44. 3.3 函数组合
  45. 3.4 扩展函数式支持
  46. 3.4.1 添加默认方法
  47. 3.4.2 显式实现函数式接口
  48. 3.4.3 创建静态辅助方法
  49. 本章要点
  50. 第二部分 Java的函数式使用方法
  51. 第4章 不可变性
  52. 4.1 面向对象编程中的可变性和数据结构
  53. 4.2 并非函数式编程专利的不可变性
  54. 4.3 Java中不可变性的现状
  55. 4.3.1 java.lang.String
  56. 4.3.2 不可变的集合
  57. 4.3.3 基本类型和基本类型的包装器
  58. 4.3.4 不可变数学对象
  59. 4.3.5 Java时间API(JSR-310)
  60. 4.3.6 枚举
  61. 4.3.7 final关键字
  62. 4.3.8 记录类型
  63. 4.4 如何实现不可变性
  64. 4.5 常见做法
  65. 本章要点
  66. 第5章 处理记录类型
  67. 5.1 数据聚合类型
  68. 5.1.1 元组
  69. 5.1.2 一个简单的POJO
  70. 5.1.3 从POJO到不可变性
  71. 5.1.4 从POJO到记录类型
  72. 5.2 记录类型来帮忙
  73. 5.2.1 后台机制
  74. 5.2.2 记录类型的功能
  75. 5.2.3 缺失的功能
  76. 5.3 使用案例和常见做法
  77. 5.3.1 记录验证和数据清理
  78. 5.3.2 增加不可变性
  79. 5.3.3 创建修改的副本
  80. 5.3.4 将记录类型用作局部的命名元组
  81. 5.3.5 更好的处理可选数据的方法
  82. 5.3.6 序列化演进的记录类型
  83. 5.3.7 记录类型的模式匹配
  84. 5.3.8 以密封类型作为组件
  85. 5.4 关于记录类型的最后几点思考
  86. 本章要点
  87. 第6章 使用流进行数据处理
  88. 6.1 使用迭代方式处理数据
  89. 6.1.1 外部迭代
  90. 6.1.2 内部迭代
  91. 6.2 作为函数式数据管道的流
  92. 6.2.1 流的特性
  93. 6.2.2 Spliterator——流的支柱
  94. 6.3 构建流管道
  95. 6.3.1 创建流
  96. 6.3.2 完成工作
  97. 6.3.3 终结流
  98. 6.3.4 操作的开销
  99. 6.3.5 修改流的行为
  100. 6.4 使用流,还是不使用?
  101. 本章要点
  102. 第7章 使用流
  103. 7.1 基本类型流
  104. 7.2 迭代流
  105. 7.3 无限的流
  106. 7.3.1 随机数
  107. 7.3.2 内存不是无限的
  108. 7.4 数组和流的相互转换
  109. 7.4.1 对象类型的数组
  110. 7.4.2 基本类型的数组
  111. 7.5 低级别的流创建方法
  112. 7.6 处理文件I/O
  113. 7.6.1 读取目录内容
  114. 7.6.2 以深度优先方式遍历目录
  115. 7.6.3 在文件系统中搜索
  116. 7.6.4 逐行读取文件
  117. 7.6.5 文件I/O流的注意事项
  118. 7.7 处理日期与时间
  119. 7.7.1 查询时间类型
  120. 7.7.2 LocalDate范围流
  121. 7.8 使用JMH测量流的性能
  122. 7.9 进一步了解收集器
  123. 7.9.1 下游收集器
  124. 7.9.2 创建自己的收集器
  125. 7.10 自定义中间操作(Java 22及以上版本)
  126. 7.10.1 在没有聚合器的情况下自定义distinct操作
  127. 7.10.2 通过聚合器实现自定义的distinct操作
  128. 7.11 关于顺序流的最后几点思考
  129. 本章要点
  130. 第8章 使用流并行处理数据
  131. 8.1 并发与并行
  132. 8.2 流作为并行的函数式管道
  133. 8.3 并行流实战
  134. 8.4 何时使用并行流以及何时应该避免使用
  135. 8.4.1 选择合适的数据源
  136. 8.4.2 元素个数
  137. 8.4.3 流操作
  138. 8.4.4 流的开销与可用资源之间的关系
  139. 8.4.5 示例:再看《战争与和平》的例子
  140. 8.4.6 示例:随机数
  141. 8.5 流行流检查清单
  142. 本章要点
  143. 第9章 使用Optional处理null
  144. 9.1 处理null引用的问题
  145. 9.2 在引入Optional之前,Java是如何处理null的
  146. 9.2.1 处理null的最佳实践
  147. 9.2.2 工具辅助的null检查
  148. 9.2.3 类似于Optional的专用类型
  149. 9.3 Optional类型来帮忙
  150. 9.3.1 什么是Optional
  151. 9.3.2 构建Optional管道
  152. 9.4 Optional和流
  153. 9.4.1 将Optional用作流的元素
  154. 9.4.2 终结流操作
  155. 9.5 基本类型的Optional
  156. 9.6 注意事项
  157. 9.6.1 Optional是普通类型
  158. 9.6.2 需要区分对象同一性的方法
  159. 9.6.3 性能开销
  160. 9.6.4 对于集合的特殊考虑
  161. 9.6.5 Optional与序列化
  162. 9.7 关于null引用的最后几点思考
  163. 本章要点
  164. 第10章 函数式异常处理
  165. 10.1 Java异常处理概述
  166. 10.2 try-catch块
  167. 10.3 Lambda表达式中的检查型异常
  168. 10.3.1 安全方法提取
  169. 10.3.2 取消检查异常
  170. 10.3.3 隐式抛出异常
  171. 10.4 函数式异常处理
  172. 10.4.1 不抛出异常
  173. 10.4.2 以值的形式表示错误
  174. 10.4.3 try/success/failure模式
  175. 10.5 关于函数式异常处理的最后几点思考
  176. 本章要点
  177. 第11章 惰性求值
  178. 11.1 惰性求值与严格求值
  179. 11.2 Java有多严格
  180. 11.2.1 短路求值
  181. 11.2.2 控制结构
  182. 11.2.3 JDK中的惰性求值类型
  183. 11.3 Lambda表达式和高阶函数
  184. 11.3.1 急切求值方法
  185. 11.3.2 更为惰性的方法
  186. 11.3.3 函数式方法
  187. 11.4 利用Thunk实现延迟执行
  188. 11.4.1 创建一个简单的Thunk
  189. 11.4.2 线程安全的Thunk
  190. 11.5 关于惰性求值的最后几点思考
  191. 本章要点
  192. 第12章 递归
  193. 12.1 什么是递归
  194. 12.1.1 头递归与尾递归
  195. 12.1.2 递归与调用栈
  196. 12.2 一个更复杂的示例
  197. 12.2.1 用迭代方法实现树的遍历
  198. 12.2.2 用递归方式实现树的遍历
  199. 12.3 递归式流
  200. 12.4 关于递归的最后几点思考
  201. 本章要点
  202. 第13章 异步任务
  203. 13.1 异步与同步
  204. 13.2 Java中的Future
  205. 13.3 使用CompletableFuture设计异步管道
  206. 13.3.1 通过Promise机制获得值
  207. 13.3.2 创建CompletableFuture
  208. 13.3.3 组合和合并任务
  209. 13.3.4 异常处理
  210. 13.3.5 终结操作
  211. 13.3.6 创建CompletableFuture辅助方法
  212. 13.4 CompletableFuture的手动创建和完成
  213. 13.4.1 手动创建
  214. 13.4.2 手动完成
  215. 13.4.3 手动创建和完成实例的使用场景
  216. 13.5 关于线程池和超时
  217. 13.6 关于异步任务的最后几点思考
  218. 本章要点
  219. 第14章 函数式设计模式
  220. 14.1 何谓设计模式
  221. 14.2 (函数式)设计模式
  222. 14.2.1 工厂模式
  223. 14.2.2 装饰器模式
  224. 14.2.3 策略模式
  225. 14.2.4 生成器模式
  226. 14.3 关于函数式设计模式的最后几点思考
  227. 本章要点
  228. 第15章 Java的函数式使用方法
  229. 15.1 面向对象编程与函数式编程原则
  230. 15.2 函数式思维方式
  231. 15.2.1 函数是一等公民
  232. 15.2.2 避免副作用
  233. 15.2.3 使用map/filter/reduce进行函数式数据处理
  234. 15.2.4 抽象指导实现
  235. 15.2.5 构建函数式桥梁
  236. 15.2.6 并行和并发变得简单
  237. 15.2.7 注意潜在的开销
  238. 15.3 在命令式世界中的函数式架构
  239. 15.3.1 从对象到值
  240. 15.3.2 关注点分离
  241. 15.3.3 FC/IS的不同规模
  242. 15.3.4 对FC/IS架构进行测试
  243. 15.4 关于Java的函数式使用方法的最后几点思考
  244. 本章要点
书名:Java函数式编程实战
作者:Ben Weidig
译者:臧秀涛, 郑云飞 译
国内出版社:东南大学出版社
出版时间:2026年09月(预计)
页数:451(预计)
书号:978-7-5766-1960-7
原版书书名:A Functional Approach to Java
原版书出版商:O'Reilly Media
Ben Weidig
 
Ben Weidig经营着一家基于Java的SaaS公司。他在使用各种编程语言进行专业的Web、移动和系统编程方面拥有近20年的经验。Ben还是一位活跃的开源贡献者。
 
 
本书封面上的动物是裸喉虎鹭(学名:Tigrisoma mexicanum),原产于墨西哥和中美洲。这种鸟类常出没于河流和湖泊岸边的开阔地带,它们会静立水中,等待猎物(如鱼类、甲壳类或青蛙)进入它们长而尖锐的喙的攻击范围。
虎鹭属于中等体型的鸟类,身长约31英寸。幼鸟羽毛呈肉桂棕色,翅膀、喉咙和腹部密布不规则条纹(称为蠢状斑)。成年后,羽毛逐渐变为灰色和黑色斑驳,有黑色的冠羽。其喉部和眼先(眼睛和喙之间的区域)呈亮黄色。其学名Tigresoma来源于希腊语,意为“老虎的身体”,指的是其条纹状的外观。
虎鹭通常独居,在繁殖季节会在树上筑巢,每窝产卵2枚到3枚。巢由交错的细枝搭成,有时缝隙较大,可能会让卵从中掉落。尽管如此,国际自然保护联盟(IUCN)并未将该物种列为受威胁物种。
购买选项
定价:149.00元(预计)
书号:978-7-5766-1960-7
出版社:东南大学出版社