展开全部

主编推荐语

这并不是一本关于Java的书,而是一本关于函数式编程的书。

内容简介

本书通过例子、练习和图表,学习函数式编程的基本原则。

作者由浅入深地介绍了函数式编程的思维方式,并引导读者通过易于掌握的例子、练习和图表来学习和巩固函数式编程的基本原则和最佳实践。读者甚至可以在阅读的同时编写出自己的函数式类库。

本书非常适合对Java有所了解的程序员,无须任何基础的数学理论或是函数式编程经验即可快速上手。

目录

  • 版权信息
  • 内容简介
  • 译者序
  • 译者简介
  • 为什么要函数式编程
  • 序言
  • 致谢
  • 关于本书
  • 第1章 什么是函数式编程
  • 1.1 函数式编程是什么
  • 1.2 编写没有副作用的程序
  • 1.3 引用透明如何让程序更安全
  • 1.4 函数式编程的优势
  • 1.5 用代换模型来推断程序
  • 1.6 将函数式原则应用于一个简单的例子
  • 1.7 抽象到极致
  • 1.8 总结
  • 第2章 在Java中使用函数
  • 2.1 什么是函数
  • 2.1.1 现实世界里的函数
  • 2.2 Java中的函数
  • 2.2.1 函数式的方法
  • 2.2.2 Java的函数式接口与匿名类
  • 2.2.3 复合函数
  • 2.2.4 多态函数
  • 2.2.5 通过lambda简化代码
  • 2.3 高级函数特性
  • 2.3.1 多参函数怎么样
  • 2.3.2 应用柯里化函数
  • 2.3.3 高阶函数
  • 2.3.4 多态高阶函数
  • 2.3.5 使用匿名函数
  • 2.3.6 局部函数
  • 2.3.7 闭包
  • 2.3.8 部分函数应用和自动柯里化
  • 2.3.9 交换部分应用函数的参数
  • 2.3.10 递归函数
  • 2.3.11 恒等函数
  • 2.4 Java 8的函数式接口
  • 2.5 调试lambda
  • 2.6 总结
  • 第3章 让Java更加函数式
  • 3.1 使标准控制结构具有函数式风格
  • 3.2 抽象控制结构
  • 3.2.1 清理代码
  • 3.2.2 if … else的另一种方式
  • 3.3 抽象迭代
  • 3.3.1 使用映射抽象列表操作
  • 3.3.2 创建列表
  • 3.3.3 使用head和tail操作
  • 3.3.4 函数式地添加列表元素
  • 3.3.5 化简和折叠列表
  • 3.3.6 复合映射和映射复合
  • 3.3.7 对列表应用作用
  • 3.3.8 处理函数式的输出
  • 3.3.9 构建反递归列表
  • 3.4 使用正确的类型
  • 3.4.1 标准类型的问题
  • 3.4.2 定义值类型
  • 3.4.3 值类型的未来
  • 3.5 总结
  • 第4章 递归、反递归和记忆化
  • 4.1 理解反递归和递归
  • 4.1.1 探讨反递归和递归的加法例子
  • 4.1.2 在Java中实现递归
  • 4.1.3 使用尾调用消除
  • 4.1.4 使用尾递归方法和函数
  • 4.1.5 抽象递归
  • 4.1.6 为基于栈的递归方法使用一个直接替代品
  • 4.2 使用递归函数
  • 4.2.1 使用局部定义的函数
  • 4.2.2 使函数成为尾递归
  • 4.2.3 双递归函数:斐波那契数列示例
  • 4.2.4 让列表的方法变成栈安全的递归
  • 4.3 复合大量函数
  • 4.4 使用记忆化
  • 4.4.1 命令式编程中的记忆化
  • 4.4.2 递归函数的记忆化
  • 4.4.3 自动记忆化
  • 4.5 总结
  • 第5章 用列表处理数据
  • 5.1 如何对数据集合进行分类
  • 5.1.1 不同的列表类型
  • 5.1.2 对列表性能的相对期望
  • 5.1.3 时间与空间,时间与复杂度的取舍
  • 5.1.4 直接修改
  • 5.1.5 持久化数据结构
  • 5.2 一个不可变、持久化的单链表实现
  • 5.3 在列表操作中共享数据
  • 5.3.1 更多列表操作
  • 5.4 使用高阶函数递归折叠列表
  • 5.4.1 基于堆的foldRight递归版
  • 5.4.2 映射和过滤列表
  • 5.5 总结
  • 第6章 处理可选数据
  • 6.1 空指针的问题
  • 6.2 空引用的替代方案
  • 6.3 Option数据类型
  • 6.3.1 从Option中取值
  • 6.3.2 将函数应用于可选值
  • 6.3.3 复合Option处理
  • 6.3.4 Option的用例
  • 6.3.5 复合Option的其他方法
  • 6.3.6 复合Option和List
  • 6.4 Option的其他实用程序
  • 6.4.1 检查是Some还是None
  • 6.4.2 equals和hashcode
  • 6.5 如何及何时使用Option
  • 6.6 总结
  • 第7章 处理错误和异常
  • 7.1 待解决的问题
  • 7.2 Either类型
  • 7.2.1 复合Either
  • 7.3 Result类型
  • 7.3.1 为Result类添加方法
  • 7.4 Result模式
  • 7.5 Result处理进阶
  • 7.5.1 应用断言
  • 7.5.2 映射Failure
  • 7.5.3 增加工厂方法
  • 7.5.4 应用作用
  • 7.5.5 Result复合进阶
  • 7.6 总结
  • 第8章 列表处理进阶
  • 8.1 length的问题
  • 8.1.1 性能问题
  • 8.1.2 记忆化的优点
  • 8.1.3 记忆化的缺点
  • 8.1.4 实际性能
  • 8.2 复合List和Result
  • 8.2.1 List中返回Result的方法
  • 8.2.2 将List<Result>转换为Result<List>
  • 8.3 抽象常见列表用例
  • 8.3.1 压缩和解压缩列表
  • 8.3.2 通过索引访问元素
  • 8.3.3 拆分列表
  • 8.3.4 搜索子列表
  • 8.3.5 使用列表的其他函数
  • 8.4 自动并行处理列表
  • 8.4.1 并非所有的计算都可以并行化
  • 8.4.2 将列表拆分为子列表
  • 8.4.3 并行处理子列表
  • 8.5 总结
  • 第9章 使用惰性
  • 9.1 理解严格和惰性
  • 9.1.1 Java是一门严格的语言
  • 9.1.2 严格带来的问题
  • 9.2 实现惰性
  • 9.3 只有惰性才能做到的事
  • 9.4 为何不要用Java 8中的Stream
  • 9.5 创建一个惰性列表数据结构
  • 9.5.1 记忆已计算的值
  • 9.5.2 对流的操作
  • 9.6 惰性的真正本质
  • 9.6.1 折叠流
  • 9.7 处理无限流
  • 9.8 避免null引用和可变字段
  • 9.9 总结
  • 第10章 用树进行更多数据处理
  • 10.1 二叉树
  • 10.1.1 平衡树和非平衡树
  • 10.1.2 大小、高度和深度
  • 10.1.3 叶树
  • 10.1.4 有序二叉树或二叉搜索树
  • 10.1.5 插入顺序
  • 10.1.6 树的遍历顺序
  • 10.2 实现二叉搜索树
  • 10.3 从树中删除元素
  • 10.4 合并任意树
  • 10.5 折叠树
  • 10.5.1 用两个函数折叠
  • 10.5.2 用一个函数折叠
  • 10.5.3 选择哪种折叠的实现
  • 10.6 映射树
  • 10.7 平衡树
  • 10.7.1 旋转树
  • 10.7.2 使用DSW算法平衡树
  • 10.7.3 自动平衡树
  • 10.7.4 解决正确的问题
  • 10.8 总结
  • 第11章 用高级树来解决真实问题
  • 11.1 性能更好且栈安全的自平衡树
  • 11.1.1 树的基本结构
  • 11.1.2 往红黑树中插入元素
  • 11.2 红黑树的用例:map
  • 11.2.1 实现map
  • 11.2.2 扩展map
  • 11.2.3 使用键不可比较的map
  • 11.3 实现函数式优先队列
  • 11.3.1 优先队列访问协议
  • 11.3.2 优先队列使用案例
  • 11.3.3 实现需求
  • 11.3.4 左倾堆数据结构
  • 11.3.5 实现左倾堆
  • 11.3.6 实现像队列一样的接口
  • 11.4 元素不可比较的优先队列
  • 11.5 总结
  • 第12章 用函数式的方式处理状态改变
  • 12.1 一个函数式的随机数发生器
  • 12.1.1 随机数发生器接口
  • 12.1.2 实现随机数发生器
  • 12.2 处理状态的通用API
  • 12.2.1 使用状态操作
  • 12.2.2 复合状态操作
  • 12.2.3 递归状态操作
  • 12.3 通用状态处理
  • 12.3.1 状态模式
  • 12.3.2 构建一个状态机
  • 12.3.3 何时使用状态和状态机
  • 12.4 总结
  • 第13章 函数式输入/输出
  • 13.1 在上下文中应用作用
  • 13.1.1 作用是什么
  • 13.1.2 实现作用
  • 13.1.3 用于失败情况的更强大的作用
  • 13.2 读取数据
  • 13.2.1 从控制台读取
  • 13.2.2 从文件中读取
  • 13.2.3 检查输入
  • 13.3 真正的函数式输入/输出
  • 13.3.1 怎样才能让输入/输出是完全函数式的
  • 13.3.2 实现纯函数式的输入/输出
  • 13.3.3 合并IO
  • 13.3.4 用IO处理输入
  • 13.3.5 扩展IO类型
  • 13.3.6 使IO类型栈安全
  • 13.4 总结
  • 第14章 通过actor共享可变状态
  • 14.1 actor模型
  • 14.1.1 异步消息
  • 14.1.2 处理并行
  • 14.1.3 处理actor状态变化
  • 14.2 构建actor框架
  • 14.2.1 actor框架的限制
  • 14.2.2 设计actor框架接口
  • 14.2.3 AbstractActor的实现
  • 14.3 开始使用actor
  • 14.3.1 实现乒乓示例
  • 14.3.2 一个更严谨的例子:并行运行一个计算
  • 14.3.3 重新排序结果
  • 14.3.4 解决性能问题
  • 14.4 总结
  • 第15章 以函数式的方式解决常见问题
  • 15.1 使用断言来校验数据
  • 15.2 从文件中读取属性
  • 15.2.1 载入属性文件
  • 15.2.2 将属性读取为字符串
  • 15.2.3 生成更好的错误消息
  • 15.2.4 像列表那样读取属性
  • 15.2.5 读取枚举值
  • 15.2.6 读取任意类型的属性
  • 15.3 转换命令式程序:XML读取器
  • 15.3.1 列出必需的函数
  • 15.3.2 复合函数并应用作用
  • 15.3.3 实现函数
  • 15.3.4 让程序更加函数式
  • 15.3.5 修复参数类型问题
  • 15.3.6 以处理元素的函数为参数
  • 15.3.7 处理元素名称错误
  • 15.4 总结
  • 附录A 使用Java 8的函数式特性
  • A.1 Optional类
  • A.2 流
  • 附录B Monad
  • 附录C 敢问路在何方
  • C.1 选一门新的语言
  • C.1.1 Haskell
  • C.1.2 Scala
  • C.1.3 Kotlin
  • C.1.4 Frege
  • C.1.5 动态类型函数式语言怎么样
  • C.2 继续Java
  • C.2.1 Functional Java
  • C.2.2 Javaslang
  • C.2.3 Cyclops
  • C.2.4 其他函数式库
  • C.3 进一步阅读
展开全部

评分及书评

尚无评分
目前还没人评分

出版方

电子工业出版社

电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。