Scala for循環(huán)

2022-05-13 14:38 更新

?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,但是你仍然可以重用它。

Yielding

在Scala的for表達式中,我們可以使用yield關鍵字來生成新的集合。

從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]類型。

擴展范圍和值定義

用于解釋的Scala可以在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) 
  }
}


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號