36.scala程式設計思想筆記——簡潔性
歡迎轉載,轉載請标明出處:http://blog.csdn.net/notbaron/article/details/50445789
源碼下載下傳連接配接請見第一篇筆記。
Scala可以簡介的表示概念,有時甚至可以說是過于簡潔。
當讓過于簡潔性可能會讓人産生一種過于複雜的印象。
1. 消除中間結果
在組合表達式中,最後一個表達式會變成整個表達式結果,如下,值會被捕獲到val result中,然後result從方法中傳回:
import com.atomicscala.AtomicTest._
def filterWithYield1(
v:Vector[Int]):Vector[Int] = {
val result =for {
n <- v
if n <10
if n % 2 !=0
} yield n
result
}
val v = Vector(1,2,3,5,6,7,8,10,13,14,17)
filterWithYield1(v) is Vector(1,3,5,7)
與将值放置到中間結果中不同,推導自身可以産生結果:
如下:
def filterWithYield2(
v:Vector[Int]):Vector[Int]= {
for {
filterWithYield2(v) is Vector(1,3,5,7)
2. 删除不必要的花括号
如果一個方法由單個表達式構成,那麼環繞該方法的花括号就不是必須的。例如:
def filterWithYield3(
v:Vector[Int]):Vector[Int] =
filterWithYield3(v) is Vector(1,3,5,7)
3. 是否使用分号?
在推導的花括号内有多個不同的表達式。行分隔符用來确定每個表達式的結束。例如:
// Semicolons allow a single-line for:
def filterWithYield4(
for{n <-v; if n < 10; if n % 2 != 0}
yield n
filterWithYield4(v) is Vector(1,3,5,7)
甚至可以将整個方法置于當個行中。
Scala作者建議,”不要使用分号”
4. 移除不必要的參數
作為對象的函數中,foreach方法将匿名函數作用于序列中每個元素的用法。例如,調用print的匿名函數作用于String的每個字母:
"OttoBoughtAnAuto".foreach(c=> print(c))
println
"OttoBoughtAnAuto".foreach(print(_))
"OttoBoughtAnAuto".foreach(print)
5. 為傳回類型使用類型推斷
為了提高簡潔性,可以使用Scala的類型推斷,進而移除傳回類型,如下:
def explicitReturnType():Vector[Int] =
Vector(11,22, 99, 34)
explicitReturnType() is
def inferredReturnType() =
inferredReturnType() is
def unitReturnType() {
unitReturnType() is (())
為了讓類型推斷起作用,在方法參數清單和方法體之間的=仍然是必須的。如果沒有=,意思該方法不會傳回任何資訊,這也可以用Unit或()來表示。
6. 用類型為名字起别名
當使用别人代碼時候,可能發現他人名字太長,可以使用type關鍵字對現有名字起一個名字,如下:
case class LongUnrulyNameFromSomeone()
type Short = LongUnrulyNameFromSomeone
new Short is LongUnrulyNameFromSomeone()
7. 需求平衡
Scala會盡量了解你的意圖。最安全的實踐Scala簡潔性的方式就是從完全明确說明開始,逐漸簡化你的代碼。
有關簡潔性的技術會産生更加緊湊的代碼,但是也會使得更加難以閱讀。要做出平衡。