科技
类型
8.2
豆瓣评分
可以朗读
语音朗读
369千字
字数
2018-01-01
发行日期
展开全部
主编推荐语
这并不是一本关于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月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。