天天看點

36.scala程式設計思想筆記——簡潔性

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簡潔性的方式就是從完全明确說明開始,逐漸簡化你的代碼。

         有關簡潔性的技術會産生更加緊湊的代碼,但是也會使得更加難以閱讀。要做出平衡。