Scala(三)之“控制結構”

  1. for和foreach循環
    遍歷一個集合中的所有元素,對集合中的每個元素進行操作,或者利用現有的集合創建一個新集合。
scala> val a = Array("apple", "banana", "orange")
a: Array[String] = Array(apple, banana, orange)

scala> for(e <- a) println(e)
apple
banana
orange

使用for/yield組合可以從輸入的集合中生成一個新的集合。

scala> val newArray = for(e <- a) yield e.toUpperCase
newArray: Array[String] = Array(APPLE, BANANA, ORANGE)

for循環計數器

scala> for(i <- 0 until 10){
     | print(i)
     | }
0123456789

生成器與守衛語句

scala> for(i <- 1 to 3)println(i)
1
2
3

scala> 1 to 3
res47: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)

scala> for(i <- 1 to 3) println(i)
1
2
3

scala> 1 to 3
res49: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)

scala> for(i <- 1 to 10 if i < 4) println(i)
1
2
3

遍歷Map集合

scala> val names = Map("fname" -> "Robert",
     | "lname" -> "Goren")
names: scala.collection.immutable.Map[String,String] = Map(fname -> Robert, lname -> Goren)

scala> for((k, v) <- names) println(s"key: $k, value: $v")
key: fname, value: Robert
key: lname, value: Goren

for循環中使用多個計數器

scala> for(i <- 1 to 2; j <- 1 to 2) println(s"i = $i, j = $j")
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2
// 對於對個for循環推薦使用大括號的風格
scala> for{
     | i <- 1 to 2
     | j <- 1 to 2
     | }println(s"i = $i, j = $j")
i = 1, j = 1
i = 1, j = 2
i = 2, j = 1
i = 2, j = 2

for循環爲多維數組賦值

scala> val array = Array.ofDim[Int](2, 2)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))

scala> for{
     | i <- 0 to 1
     | j <- 0 to 1
     | }println(s"($i)($j) = ${array(i)(j)}")
(0)(0) = 0
(0)(1) = 0
(1)(0) = 0
(1)(1) = 0

for循環中嵌入if語句,if語句又叫做過濾器

scala> for{
     | i <- 1 to 10
     | if i % 2 == 0
     | }println(i)
2
4
6
8
10

scala> for{
     | i <- 1 to 10
     | if i > 3
     | if i < 6
     | if i % 2 == 0
     | }println(i)
4

創建for表達式(for/yield組合)
在一個已有的集合上,使用帶有yield語句的for循環和算法,生成一個新的集合。
除了極個別的情況,for推導不會改變集合的返回類型

scala> val name = Array("chris", "ed", "maurice")
name: Array[String] = Array(chris, ed, maurice)

scala> val capName = for(e <- name) yield e.capitalize
capName: Array[String] = Array(Chris, Ed, Maurice)

Scala中沒有break和continue關鍵字,scala.util.control.Breaks類提供了類似的功能。

case語句中匹配多個條件

scala> val i = 5
i: Int = 5

scala> i match {
     | case 1 | 3 | 5 | 7 | 9 => println("odd")
     | case 2 | 4 | 6 | 8 | 10 => println("even")
     | }
odd

try/catch匹配一個或者多個異常

scala> val s = "foo"
s: String = foo

scala> try{
     | val i = s.toInt
     | }catch{
     | case e:Exception => e.printStackTrace
     | }
java.lang.NumberFormatException: For input string: "foo"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:272)
    at scala.collection.immutable.StringOps.toInt(StringOps.scala:29)
    at $line124.$read$$iw$$iw$.liftedTree1$1(<console>:14)
    at $line124.$read$$iw$$iw$.<init>(<console>:13)
    at $line124.$read$$iw$$iw$.<clinit>(<console>)
    at $line124.$eval$.$print$lzycompute(<console>:7)
    at $line124.$eval$.$print(<console>:6)
    at $line124.$eval.$print(<console>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:786)
    at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1047)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:638)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:637)
    at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
    at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
    at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:637)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:569)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:565)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:807)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:825)
    at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:681)
    at scala.tools.nsc.interpreter.ILoop.processLine(ILoop.scala:395)
    at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:415)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:923)
	at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
    at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
    at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97)
    at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:909)
    at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74)
    at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
    at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章