作為Java開發(fā)人員,維護糟糕的遺留代碼、解釋晦澀的注釋、反復編寫相同的樣板文件可能會讓編程失去樂趣。《Kotlin編程之美》講述用Kotlin編寫易于理解、易于維護、安全的程序的方法和技巧。在本書中,經(jīng)驗豐富的工程師皮埃爾-伊夫斯?索蒙特將以全新的、以函數(shù)式編程的視角來處理常見的編程挑戰(zhàn),并用示例深入講解如何正確處理錯誤和數(shù)據(jù)、如何管理狀態(tài)以及如何利用惰性。
《Kotlin編程之美》的內(nèi)容包括編程功能、處理可選數(shù)據(jù)、安全處理錯誤和異常以及處理和共享狀態(tài)突變等!禟otlin編程之美》的讀者對象為中級Java或Kotlin開發(fā)人員、高等院校計算機相關專業(yè)學生以及對安全編程感興趣的工程技術人員等。
目 錄
封 面
譯者序
致 謝
前 言
關于本書
關于讀者
關于封面插圖
第1章 讓程序更安全
1.1 編程陷阱
1.1.1 安全的處理作用
1.1.2 用引用透明性使程序更安全
1.2 安全編程的好處
1.2.1 使用替換模型對程序進行推理
1.2.2 應用安全原則的簡單示例
1.2.3 將抽象推向極限
1.3 本章小結(jié)
第2章 Kotlin中的函數(shù)式編程:概述
2.1 Kotlin中的字段和變量
2.1.1 省略類型以簡化
2.1.2 使用可變字段
2.1.3 理解延遲初始化
2.2 Kotlin中的類和接口
2.2.1 使代碼更加簡潔
2.2.2 實現(xiàn)接口或擴展類
2.2.3 實例化一個類
2.2.4 重載屬性構(gòu)造函數(shù)
2.2.5 創(chuàng)建equals和hashCode方法
2.2.6 解構(gòu)數(shù)據(jù)對象
2.2.7 在Kotlin中實現(xiàn)靜態(tài)成員
2.2.8 使用單例模式
2.2.9 防止工具類實例化
2.3 Kotlin沒有原語
2.4 Kotlin的兩種集合類型
2.5 Kotlin的包
2.6 Kotlin的可見性
2.7 Kotlin中的函數(shù)
2.7.1 函數(shù)聲明
2.7.2 使用局部函數(shù)
2.7.3 覆蓋函數(shù)
2.7.4 使用擴展函數(shù)
2.7.5 使用lamdba表達式
2.8 Kotlin中的null
2.8.1 處理可空類型
2.8.2 Elvis和默認值
2.9 程序流程和控制結(jié)構(gòu)
2.9.1 使用條件選擇器
2.9.2 使用多條件選擇器
2.9.3 使用循環(huán)
2.10 Kotlin的未檢查異常
2.11 自動關閉資源
2.12 Kotlin的智能轉(zhuǎn)換
2.13 相等性VS一致性
2.14 字符串插值
2.15 多行字符串
2.16 型變:參數(shù)化類型和子類型
2.16.1 為什么型變是一個潛在的問題
2.16.2 何時使用協(xié)變以及何時使用逆變
2.16.3 聲明端型變與使用端型變
2.17 本章小結(jié)
第3章 用函數(shù)編程
3.1 函數(shù)是什么?
3.1.1 理解兩個函數(shù)集之間的關系
3.1.2 Kotlin中反函數(shù)概述
3.1.3 處理偏函數(shù)
3.1.4 理解函數(shù)復合
3.1.5 使用多參數(shù)函數(shù)
3.1.6 柯里化函數(shù)
3.1.7 使用偏應用函數(shù)
3.1.8 沒有作用的函數(shù)
3.2 Kotlin中的函數(shù)
3.2.1 將函數(shù)理解為數(shù)據(jù)
3.2.2 將數(shù)據(jù)理解為函數(shù)
3.2.3 使用對象構(gòu)造函數(shù)作為函數(shù)
3.2.4 使用Kotlin的fun函數(shù)
3.2.5 使用對象表示法和函數(shù)表示法
3.2.6 使用值函數(shù)
3.2.7 使用函數(shù)引用
3.2.8 復合函數(shù)
3.2.9 重用函數(shù)
3.3 高級函數(shù)特征
3.3.1 多參數(shù)函數(shù)如何?
3.3.2 應用柯里化函數(shù)
3.3.3 實現(xiàn)高階函數(shù)
3.3.4 創(chuàng)建多態(tài)高階函數(shù)
3.3.5 使用匿名函數(shù)
3.3.6 定義局部函數(shù)
3.3.7 實現(xiàn)閉包
3.3.8 應用偏函數(shù)和自動柯里化
3.3.9 切換偏應用函數(shù)的參數(shù)
3.3.10 聲明單位函數(shù)
3.3.11 使用正確的類型
3.4 本章小結(jié)
第4章 遞歸、尾遞歸和記憶化
4.1 共遞歸與遞歸
4.1.1 實現(xiàn)共遞歸
4.1.2 實現(xiàn)遞歸
4.1.3 區(qū)分遞歸函數(shù)和共遞歸函數(shù)
4.1.4 選擇遞歸或尾遞歸
4.2 尾調(diào)用消除
4.2.1 使用尾調(diào)用消除
4.2.2 從循環(huán)切換到共遞歸
4.2.3 使用遞歸值函數(shù)
4.3 遞歸函數(shù)和列表
4.3.1 使用雙遞歸函數(shù)
4.3.2 對列表抽象遞歸
4.3.3 反轉(zhuǎn)列表
4.3.4 構(gòu)建共遞歸列表
4.3.5 嚴格的后果
4.4 記憶化
4.4.1 在基于循環(huán)的編程中使用記憶化
4.4.2 在遞歸函數(shù)中使用記憶化
4.4.3 使用隱式記憶化
4.4.4 使用自動記憶化
4.4.5 實現(xiàn)多參數(shù)函數(shù)的記憶化
4.5 記憶函數(shù)純嗎?
4.6 本章小結(jié)
第5章 用列表處理數(shù)據(jù)
5.1 如何對數(shù)據(jù)集合進行分類
5.2 不同類型的列表
5.3 相對期望列表性能
5.3.1 用時間來交換內(nèi)存空間和復雜性
5.3.2 避免就地突變
5.4 KOTLIN有哪些可用列表?
5.4.1 使用持久數(shù)據(jù)結(jié)構(gòu)
5.4.2 實現(xiàn)不可變的、持久的單鏈表
5.5 列表操作中的數(shù)據(jù)共享
5.6 更多列表操作
5.6.1 標注的益處
5.6.2 連接列表
5.6.3 從列表末尾刪除
5.6.4 使用遞歸對具有高階函數(shù)(HOFs)的列表進行折疊
5.6.5 使用型變
5.6.6 創(chuàng)建foldRight的一個棧安全遞歸版本
5.6.7 映射和過濾列表
5.7 本章小結(jié)
第6章 處理可選數(shù)據(jù)
6.1 空指針問題
6.2 Kotlin如何處理空引用
6.3 空引用的替代方法
6.4 使用OPTION類型
6.4.1 從一個Option中獲取值
6.4.2 將函數(shù)應用于可選值
6.4.3 處理Option組合
6.4.4 Option用例
6.4.5 其他組合選項的方法
6.4.6 用Option組合List
6.4.7 何時使用Option
6.5 本章小結(jié)
第7章 處理錯誤和異常
7.1 數(shù)據(jù)缺失的問題
7.2 Either類型
7.3 Result類型
7.4 Result模式
7.5 高級Result處理
7.6 映射Failture
7.7 添加工廠函數(shù)
7.8 應用作用
7.9 高級結(jié)果組合
7.10 本章小結(jié)
第8章 高級列表處理
8.1 長度問題
8.2 性能問題
8.3 記憶化的好處
8.3.1 處理記憶化的缺點
8.3.2 評估性能改進
8.4 List和Result組成
8.4.1 處理List返回Result
8.4.2 從List轉(zhuǎn)換為Result
8.5 常見列表抽象
8.5.1 壓縮和解壓縮列表
8.5.2 通過索引訪問元素
8.5.3 列表分裂
8.5.4 搜索子列表
8.5.5 處理列表的其它函數(shù)
8.6 列表的自動并行處理
8.6.1 并不是所有的計算都可以并行化
8.6.2 將列表分解為子列表
8.6.3 并行處理子列表
8.7 本章小結(jié)
第9章 與惰性配合
9.1 嚴格VS惰性
9.2 Kotlin和嚴格
9.3 Kotlin和惰性
9.4 懶惰的實現(xiàn)
9.4.1 組合惰性值
9.4.2 提升函數(shù)
9.4.3 映射和flatMapping惰性
9.4.4 用列表組成惰性
9.4.5 處理異常
9.5 深層次的惰性構(gòu)成
9.5.1 惰性應用作用
9.5.2 不能沒有惰性
9.5.3 創(chuàng)建一個惰性列表數(shù)據(jù)結(jié)構(gòu)
9.6 處理流
9.6.1 折疊流
9.6.2 跟蹤計算和函數(shù)應用
9.6.3 將流應用于具體問題
9.7 本章小結(jié)
第10章 使用樹處理更多的數(shù)據(jù)
10.1 二叉樹
10.2 了解平衡和不平衡的樹
10.3 樹的大小、高度和深度
10.4 空樹和遞歸定義
10.5 多葉樹
10.6 有序二叉樹或二叉搜索樹
10.7 插入順序和樹的結(jié)構(gòu)
10.8 遞歸和非遞歸樹遍歷順序
10.8.1 遞歸遍歷樹
10.8.2 非遞歸遍歷樹
10.9 實現(xiàn)二叉搜索樹
10.9.1 理解型變和樹
10.9.2 Tree類中的抽象函數(shù)
10.9.3 重載操作符
10.9.4 樹中遞歸
10.9.5 從樹中移除元素
10.9.6 合并任意樹
10.10 關于折疊樹
10.10.1 雙函數(shù)折疊
10.10.2 單函數(shù)折疊
10.10.3 如何選擇折疊實現(xiàn)
10.11 映射樹
10.12 平衡樹
10.12.1 旋轉(zhuǎn)樹
10.12.2 使用Day-Stout-Warren算法
10.12.3 自動平衡樹
第11章 用高級樹解決問題
11.1 自平衡樹的性能更好,棧更安全
11.1.1 了解基本的紅黑樹結(jié)構(gòu)
11.1.2 向紅黑樹中添加元素
11.1.3 從紅黑樹中移除元素
11.2 一個紅黑樹的用例:Map
11.2.1 實現(xiàn)Map
11.2.2 擴展Map
11.2.3 使用具有不可比較鍵的Map
11.3 實現(xiàn)功能優(yōu)先隊列
11.3.1 查看優(yōu)先隊列訪問協(xié)議
11.3.2 探索優(yōu)先級隊列用例
11.3.3 查看實現(xiàn)需求
11.3.4 左傾堆數(shù)據(jù)結(jié)構(gòu)
11.3.5 實現(xiàn)左傾堆
11.3.6 實現(xiàn)類似隊列的接口
11.4 元素和有序列表
11.5 不可比較元素的優(yōu)先隊列
11.6 本章小結(jié)
第12章 函數(shù)式輸入/輸出
12.1 作用在上下文中是什么意思
12.1.1 處理作用
12.1.2 實現(xiàn)作用
12.2 讀取數(shù)據(jù)
12.2.1 從控制臺讀取數(shù)據(jù)
12.2.2 從文件中讀取數(shù)據(jù)
12.3 輸入測試
12.4 全函數(shù)式輸入/輸出
12.4.1 使輸入/輸出全函數(shù)式
12.4.2 實現(xiàn)純函數(shù)式的輸入/輸出
12.4.3 結(jié)合輸入/輸出
12.4.4 用IO處理輸入
12.4.5 擴展IO類型
12.4.6 使IO類型堆棧安全
12.5 本章小結(jié)
第13章 與參與者共享可變狀態(tài)
13.1 角色模型
13.1.1 理解異步消息傳遞
13.1.2 并行化處理
13.1.3 處理角色狀態(tài)突變
13.2 角色框架實現(xiàn)
13.2.1 理解局限性
13.2.2 設計角色框架接口
13.3 AbstractActor的實現(xiàn)
13.4 讓角色投入工作
13.4.1 實現(xiàn)乒乓球例子
13.4.2 并行運行計算
13.4.3 重排結(jié)果
13.4.4 優(yōu)化性能
13.5 本章小結(jié)
第14章 解決常見功能性問題
14.1 斷言和數(shù)據(jù)驗證
14.2 函數(shù)和作用的重試
14.3 從文件中讀入屬性
14.3.1 加載屬性文件
14.3.2 以字符串形式讀取屬性
14.3.3 生成更好的錯誤消息
14.3.4 將屬性作為列表讀取
14.3.5 讀取枚舉值
14.3.6 讀取任意類型的屬性
14.4 轉(zhuǎn)換命令式風格的程序:XML閱讀器
14.4.1 第1步:命令式風格的解決方案
14.4.2 第2步:將命令式風格的代碼轉(zhuǎn)換為函數(shù)式
14.4.3 第3步:將程序轉(zhuǎn)換得更函數(shù)式
14.4.4 第4步:修復參數(shù)類型問題
14.4.5 第5步:使元素處理函數(shù)成為參數(shù)
14.4.6 第6步:對元素名稱進行錯誤處理
14.4.7 第7步:對先前命令式代碼的額外改進
14.5 本章小結(jié)
附錄 A-將Kotlin與Java結(jié)合
A.1 創(chuàng)建和管理混合項目402
A.1.1 利用Gradle創(chuàng)建一個簡單的項目
A.1.2 將Gradle項目導入IntelliJ
A.1.3 為項目增加依賴
A.1.4 創(chuàng)建多模塊項目
A.1.5 為多模塊項目增加依賴
A.2 Java庫方法和Kotlin代碼
A.2.1 使用Java基本類型
A.2.2 使用Java數(shù)值對象類型
A.2.3 對null值快速失敗
A.2.4 使用Kotlin和Java的字符串類型
A.2.5 實現(xiàn)其他類型的轉(zhuǎn)換
A.2.6 使用Java可變參數(shù)
A.2.7 在Java中指定可空性
A.2.8 調(diào)用getter方法和setter方法
A.2.9 使用保留字獲取Java屬性
A.2.10 調(diào)用已檢查異常
A.3 SAM接口
A.4 Kotlin函數(shù)和Java代碼
A.4.1 轉(zhuǎn)換Kotlin屬性
A.4.2 使用Kotlin公共字段
A.4.3 靜態(tài)字段
A.4.4 將Kotlin函數(shù)作為Java方法調(diào)用
A.4.5 將Kotlin的類型轉(zhuǎn)換為Java類型
A.4.6 函數(shù)類型
A.5 混合Kotlin/Java項目的特定問題
附錄B-Kotlin中基于屬性的測試
B.1 為何使用基于屬性的測試
B.1.1 編寫接口
B.1.2 編寫測試程序
B.2 什么是基于屬性的測試
B.3 抽象及基于屬性的測試
B.4 基于屬性的單元測試的依賴
B.5 編寫基于屬性的測試程序
B.5.1 創(chuàng)建自定義生成器
B.5.2 使用自定義生成器
B.5.3 通過更進一步抽象來簡化代碼