?for
?循環(huán)是一個非常強大的Scala語言的控制結構。
它提供了迭代集合的能力,它還提供過濾選項和生成新集合的能力。
讓我們從表達式的基本開始:
object Main { def main(args: Array[String]) { val dogBreeds = List("A", "B", "C", "D", "E", "F") for (breed <- dogBreeds) println(breed) } }
Expression的Basic是for
表達式的一個非?;镜奶匦浴?
首先,我們需要一個用于表達式將迭代的集合。我們創(chuàng)建一個書籍列表,如下面的代碼所示:
val books = List("Scala", "Groovy", "Java", "SQL", "CSS")
現(xiàn)在我們可以寫一個非?;镜谋磉_式來遍歷圖書列表。
object Main { def main(args: Array[String]) { val books = List("Scala", "Groovy", "Java", "SQL", "CSS") for (book<-books) println(book) } }
在上面的代碼中for
表達式為列表書中的每個元素創(chuàng)建一個名為book的臨時變量以及該元素的相應值。
左箭頭操作符稱為生成器,因為它從表達式中使用的集合生成相應的值。
breed <- dogBreeds
稱為生成器表達式,因此命名是因為它從集合中生成單個值。左箭頭運算符(< - )用于遍歷一個集合,例如List。
我們還可以使用它與范圍來寫一個更傳統(tǒng)的尋找循環(huán):
object Main { def main(args: Array[String]) { for (i <- 1 to 10) println(i) } }
我們可以添加if
表達式來過濾我們想要保留的元素。
這些表達式稱為約束。
要找到我們的狗品種列表中的所有D,我們修改前面的例子如下:
object Main { def main(args: Array[String]) { val dogBreeds = List("D", "Y", "D", "S", "G", "P") for (breed <- dogBreeds if breed.contains("D") ) println(breed) } }您可以有多個約束:
object Main { def main(args: Array[String]) { val dogBreeds = List("D", "Y", "D", "S", "G", "P") for (breed <- dogBreeds if breed.contains("D") if !breed.startsWith("Y") ) println(breed) for (breed <- dogBreeds if breed.contains("D") && !breed.startsWith("Y") ) println(breed) } }過濾器是for表達式中的if子句,用于過濾集合,當我們不想遍歷整個集合時。
以下代碼顯示如何在我們的書籍列表中查找所有Scala圖書。
object Main { def main(args: Array[String]) { val books = List("Scala", "Groovy", "Java", "SQL", "CSS") for(book<-books if book.contains("Scala") ) println(book) } }
然后我們可以在你的for表達式的正文中重用這些變量。
object Main { def main(args: Array[String]) { val books = List("Scala", "Groovy", "Java", "SQL", "CSS") for { book <- books bookVal = book.toUpperCase() } println(bookVal) } }
bookVal
沒有聲明為val,但是你仍然可以重用它。
從for表達式生成的集合的類型從迭代的集合的類型推斷。
要在for循環(huán)中將值賦給我們的程序的另一部分,請使用yield
關鍵字為表達式生成新的集合。
object Main { def main(args: Array[String]) { val dogBreeds = List("D", "Y", "D", "S", "G", "P") val filteredBreeds = for { breed <- dogBreeds if breed.contains("T") && !breed.startsWith("Y") } yield breed } }以下代碼顯示如何對集合使用yield。
object Main { def main(args: Array[String]) { val books = List("Scala", "Groovy", "Java", "SQL", "CSS") var scalabooks = for{ book <-books if book.contains("Scala") }yield book println(scalabooks); } }過濾的結果作為名為
book
的值生成。
這個結果是在for循環(huán)中每次運行時累積的,因此累積的集合被分配給值scalabooks。
scalabook是List [String]類型,因為它是圖書列表的一個子集,也是List [String]類型。
for
表達式的第一部分中定義可用于后面表達式的值,如下例所示:
object Main { def main(args: Array[String]) { val dogBreeds = List("D", "Y", "D", "S", "G", "P") for { breed <- dogBreeds upcasedBreed = breed.toUpperCase() } println(upcasedBreed) } }
更多建議: