dw java 编码_dW 编辑推荐:Java 8 习惯用语,第 4 部分:提倡使用有帮助的编码方式...
原標題:dW 編輯推薦:Java 8 習慣用語,第 4 部分:提倡使用有幫助的編碼方式
表達能力是函數式編程的優勢之一,但這對您的代碼意味著什么?在本文中,我們將比較命令式和函數式代碼的示例,判斷這兩者的表達能力和簡潔性的品質。您將了解這些品質如何幫助確保可讀性,還會考慮一個反面示例:對簡潔性的過度追求導致代碼無用。最后,我將介紹Java 8 對于函數組合中的垂直對齊點的約定。盡管一些 Java 開發人員可能不熟悉此約定,但可以用一個簡單示例來證明其價值。
令人驚訝的結果
在 Java 8 發布一年左右,我在自己的網站上宣布進行一次簡短且不受約束的調查,并邀請開發人員參與該調查。每個參與者都會看到一段命令式或函數式代碼,然后需要確定代碼的行為。我計算了每位訪問者提供回復所花的時間,并比較來自兩個不同代碼示例的結果。該調查開放了48 小時,在此期間有 1,100 多人參與調查。調查結果令人感到有些驚訝。
大部分開發人員,包括作者本人,都有豐富的命令式編程經驗。盡管函數式編程已存在很長時間,但大部分 Java 程序員都對它并不熟悉。了解到這一點后,82% 的收到命令式代碼的調查回復者能確定其正確行為并不令人感到驚訝。與此同時,收到函數式代碼的回復者中只有 75% 回答正確。
但是,令我驚訝的是回復者理解兩個代碼示例所用的時間。理解命令式代碼所用的平均時間比理解函數式代碼所用的平均時間長 30 秒。
在家里嘗試這個實驗
函數式代碼比命令式代碼更富于表達且更簡潔 —前提是需要精心編寫。一個簡單示例可以證明這一點。在查看下面的代碼示例之前,請準備一個計時器。像我的調查回復者一樣,您的任務是理解代碼的細節。您要計算每個示例所需的時間。
準備好了嗎?啟動計時器并閱讀下面的代碼,然后寫下您預計它會產生的行為。
清單 1. 命令式代碼示例
List< String > names = Arrays.asList("Jack", "Jill", "Nate", "Kara", "Kim", "Jullie", "Paul", "Peter");
List< String > subList = new ArrayList<>();
for(String name : names) {
if(name.length() == 4)
subList.add(name);
}
StringBuilder namesOfLength4 = new StringBuilder();
for(int i = 0; i < subList.size () - 1; i++) {
namesOfLength4.append(subList.get(i));
namesOfLength4.append(", ");
}
if(subList.size() > 1)
namesOfLength4.append(subList.get(subList.size() - 1));
System.out.println(namesOfLength4);
您理解此代碼需要多少時間?如果時間比您預計的要長,不要驚訝。與其說這個時間反映了您的能力,不如說它反映了該代碼的糟糕品質。
現在考慮一個使用 Java 8 支持的函數樣式編寫的等效示例:
清單 2. 函數式代碼示例
List< String > names = Arrays.asList("Jack", "Jill", "Nate", "Kara", "Kim", "Jullie", "Paul", "Peter");
System.out.println(
names.stream()
.filter(name -> name.length() == 4)
.collect(Collectors.joining(", ")));
您理解此代碼會花用多少時間?顯然,您已經確定了清單 1 的用途,所以這不是一次真正的實驗。如果想真正比較這些示例,可以要求一些同事來理解一個或另一個代碼示例,然后比較他們的回復時間。
函數式編碼為什么至關重要
如果您熟悉 Java 8,可能會順利理解清單 2 中的代碼。即使不熟悉 Java 8,得益于描述性的方法名稱,您可能也能理解它。您還能快速理解此代碼,因為它比清單 1 簡潔得多。
基本上講,該代碼的含義是:給定一個名稱集合,僅選擇長度為 4 的名稱,然后通過逗號將它們連接起來。
這個示例是人為的,但它確實證明了簡潔性和表達能力在編碼中的價值。我們在函數式代碼中看到的這些品質比命令式代碼中要多得多。
編寫可讀的代碼
函數式代碼富于表達且簡潔,這使程序不但更短,而且更容易閱讀。考慮另一個示例:
清單 3. 命令式代碼示例
int result = 0;
for(int e : numbers) {
if(e > 3 && e % 2 == 0 && e < 8) {
result += e * 2;
}
}
System.out.println(result);
給定名為 numbers 的列表,此代碼將計算大于 3 且小于 8 的偶數并將該數字乘以 2,然后輸出結果。該代碼包含 7 行,我們可能可以減少一兩行。
更多內容,請閱讀原文。返回搜狐,查看更多
責任編輯:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的dw java 编码_dW 编辑推荐:Java 8 习惯用语,第 4 部分:提倡使用有帮助的编码方式...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么回事?ChatGPT Plus突然停
- 下一篇: 飞利浦推出新款44.5寸带鱼屏:弹出式摄