來源:互聯網
上載者:User
關鍵字
java
Scala
共同點
Clojure
Groovy
在 上一期文章 中,我介紹了 JAVA 下一代語言用來消除 JAVA 語言中華而不實的東西和複雜性的創新方式。 在這一期文章中,我將展示這些語言如何消除 JAVA 的一些瑕疵:異常、語句與運算式,以及圍繞 HTTP://www.aliyun.com/zixun/aggregation/19527.html">null 的邊緣情況。
運算式
JAVA 語言從 C 語言那裡繼承的一項傳承是區分程式設計語言 和程式設計運算式。 JAVA 語句的示例包括使用 if 或 while 的程式碼,以及使用 void 來聲明不會返回任何值的方法的程式碼。 運算式(比如 1 + 2 )用於求取某一個值。
這種區分在最早的程式設計語言中就已經開始,比如在 Fortran 中,這種區分基於硬體條件以及對程式設計語言設計的初步瞭解。 在許多語言中,它被保留為操作(語句)與求值(運算式)的指示器。 但語言設計人員逐漸意識到,該語言可以完全由運算式組成,在對結果不感興趣的時候忽略結果。 事實上,所有函數式語言完全可以消除這種區分,僅使用運算式。
Groovy 的 if 和 ?:
在 JAVA 下一代語言中,傳統的命令式語言(Groovy)和函數式語言(Clojure 和 Scala)之間的分離展示了向運算式的進化。 Groovy 仍然包含語句,這些語句基於 JAVA 語法,但添加了更多的運算式。 而 Scala 和 Clojure 則完全使用運算式。
語句和運算式中包含的內容都為語言增添了語法上的笨拙。 可以考慮 Groovy 中的 if 語句,它繼承自 JAVA。 它有兩個版本,清單 1 對它們進行了比較,這兩個版本是用於執行判斷的 if 語句,以及神秘的三元運算子 ?::
清單 1. Groovy 的兩個 if 語句
def x = 5def y = 0if (x % 2 == 0) y = x * 2else y = x - 1println y // 4y = x % 2 == 0 ? (x *= 2) : (x -= 1)println y // 4
在 if 語句 清單 1 中,我必須將 x 的值設置為一個副作用 (side effect),因為 if 語句沒有返回任何值。 要執行判斷並同時進行賦值,必須使用三元賦值,如 清單 1 中的第二個設定陳述式所示。
Scala 的基於運算式的 if 語句
Scala 消除了對三元運算子的需求,允許 if 運算式對兩種情況都進行處理。 您可以使用它,就像在 JAVA 代碼中使用 if 語句那樣(忽略傳回值),或者在設定陳述式中使用它,如清單 2 中所示:
清單 2. Scala 的基於運算式的 if 語句
val x = 5val y = if (x % 2 == 0) x * 2 else x - 1println(y)
Scala 和其他兩種 JAVA 下一代語言一樣,不要求方法中包含明確的 return 語句。 因此,方法的最後一行是傳回值,強調了這些語言中的方法的基於運算式的特性。
當您在 JAVA 和 Groovy 代碼中進行操作和設置值時,可以將每個回應封裝為一個代碼塊,如清單 3 中所示,並包含任何所需的副作用:
清單 3. Scala if + 副作用
val z = if (x % 2 == 0) { println("divisible by 2") x * 2 } else { println("not divisible by 2; odd") x - 1 }println(z)
在 清單 3 中,除了返回新計算得出的值之外,我還為每種情況列印了一條狀態訊息。 代碼塊中的程式碼的順序非常重要:代碼塊的最後一行表示符合條件的傳回值。 因此,當您使用基於運算式的 if 進行混合求值和具有副作用時,必須非常小心。