Java 敗給 Python?不!我有話說

在軟件工程師的職業生涯中,知識的“半衰期”通常為三年,這意味著我們掌握的一半知識在三年後將變得毫無價值。這個行業本身就意味著不斷充電與持續學習。

——蔣楠老師(譯者)

Java 败给 Python?不!我有话说

作為使用最廣泛的編程語言,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 败给 Python?不!我有话说
Java 败给 Python?不!我有话说

Modern Java Recipes: Simple Solutions to Difficult Problems in Java 8 and 9

定價:69.00元

掃碼一鍵購,現在8折優惠中

  • 迅速查找 Java 8 和 Java 9 相關特性介紹指南

  • 70 餘個提煉自開發人員日常工作的範例

介紹瞭如何利用 Java 8 和 Java 9 的新特性解決這些問題,從而以更自然的方式讓開發人員對這門語言的變化了然於心。我們可以舉一反三,將所學的知識運用到實際開發中。

Java 败给 Python?不!我有话说

如果你是一位經驗豐富的開發者,基本上無須像初學者一樣學習 Java 8 和 Java 9 引入的所有新特性,也沒有時間這樣做。這本對你來說就是一本迅速查找相關特性介紹的指南,並給出可以用於實際開發的示例。

而書中範例均來自開發人員在日常工作中遇到的問題,還有如何利用 Java 8 和 Java 9 的新特性解決這些問題,從而以更自然的方式讓開發人員對這門語言的變化了然於心。我們可以舉一反三,將所學的知識運用到實際開發中。

就算你是 Java 8 和 Java 9 的長期使用者,依然可以從中受到啟發。有關歸約運算符的討論切實加深了讀者對這種函數式編程風格的理解。專門探討 Java 9 新特性的章節正是開發人員所需要的,對所有希望提高自身知識水平的 Java 開發人員而言,本書可以說非常有用了。

細節展示

Java 败给 Python?不!我有话说Java 败给 Python?不!我有话说
Java 败给 Python?不!我有话说Java 败给 Python?不!我有话说
Java 败给 Python?不!我有话说

作譯者簡介

作者:肯·寇森(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

掃碼一鍵購,現在78折優惠中


分享到:


相關文章: