//loop with for and foreach
//-Xprint:parse/all
val fruits = Array("apple", "banana", "orange")
val upperF = for (fruit <- fruits) yield {
val s = fruit.toUpperCase
//println(s)
s
}
println(upperF.getClass.getName)
for ((elem, count) <- upperF.zipWithIndex) println(s"$count is $elem")
val mapNames = Map("fname" -> "Eric", "lname" -> "Chan")
for ((key, value) <- mapNames) println(s"key: $key, value: $value")
println()
//loop with multiply counter
val dim2 = Array.ofDim[Int](2,2)
dim2(0)(0) = 0
dim2(0)(1) = 1
dim2(1)(0) = 2
dim2(1)(1) = 3
for {
i <- 0 to 1
j <- 0 to 1
} println(s"($i)($j) = ${dim2(i)(j)}")
println()
//for guards
for {
i <- 1 to 10
if i < 5
if i % 2 == 0
} println(i)
println()
//for comprehension
//the collection type returned by a for comprehension is the same type that you begin with
val names = Array("chris", "ed", "maurice")
val capNames = for(name <- names) yield name.toUpperCase
capNames.foreach(println)
val lens = for(name <- names) yield {
name.length
}
lens.foreach(println)
val lstFruits = "apple" :: "banana" :: "orange" :: Nil
val out = for (fruit <- lstFruits) yield fruit.toUpperCase;
println(out)
println()
//Match Expression
val i = 5
i match {
case 1 => println("One")
case 2 => println("Two")
case otherValue => println(s"Other:$otherValue")
}
val cmd = "stop"
cmd match {
case "start" | "go" => println("starting")
case "stop" | "quit" | "exit" => println("stoping")
case _ => println("Do nothing")
}
//编译时确定是否需要case _
val evenOrOdd = i match {
case 1 | 3 | 5 => "odd"
case 2 | 4 | 6 => "even"
}
println(evenOrOdd)
def isTrue(a :Any) = a match {
case 0 | "" => false
case _ => true
}
println(isTrue(i))
println()
def echoWhatYouGaveMe(x: Any): String = x match {
//constant value
case 0 => "zero"
case true => "true"
case "hello" => "you said 'hello'"
case Nil => "an empty List"
//sequence patterns
case List(0, _, _) => "a three-element list with 0 as the first element"
case List(1, _*) => "a list begin with 1, having any number of elements"
case Vector(1, _*) => "a vector begin with 1, having any number of elements"
case v @ Vector(2, _*) => s"a vector begin with 2, having any number of elements, $v"
//tuples
case (a, b) => s"get $a and $b"
case (a, b, c) => s"get $a, $b and $c"
//not support int tuples
//case (a, b, c, _*) => s"get $a, $b, $c and other"
//only match one element
case (a, b, c, _) => s"get $a, $b, $c and other"
//constructor patterns
case Person(first, "Chan") => s"found an chan, first name = $first"
//must match constructor parameters count
case p @ Person(_,_) => s"$p"
case Dog("Suka") => "found a dog named Suka"
case Woodpecker => "That was a woodpecker"
//typed patterns
case s: String => s"you give me this string: $s"
case i: Int => s"you give me this int: $i"
case f: Float => s"you give me this float: $f"
case a: Array[Int] => s"an array of int: ${a.mkString(",")}"
case as: Array[String] => s"an array of string: ${as.mkString(" ")}"
case d: Dog => s"dog: ${d.name}"
case list: List[_] => s"thanks for List: $list"
case map: Map[_,_] => map.toString
case _ => "Unknown"
}
case class Person(firstName: String, lastName: String)
case class Dog(name: String)
case object Woodpecker
println("===trigger the constant patterns===")
println(echoWhatYouGaveMe(0))
println(echoWhatYouGaveMe(true))
println(echoWhatYouGaveMe("hello"))
println(echoWhatYouGaveMe(Nil))
println("===trigger the sequence patterns===")
println(echoWhatYouGaveMe(List(0,1,2)))
println(echoWhatYouGaveMe(List(1,2)))
println(echoWhatYouGaveMe(List(1,2,3)))
println(echoWhatYouGaveMe(Vector(1,2,3)))
println(echoWhatYouGaveMe(Vector(2,3,4)))
println("===trigger the tuple patterns===")
println(echoWhatYouGaveMe((1,2))) // two element tuple
println(echoWhatYouGaveMe((1,2,3))) // three element tuple
println(echoWhatYouGaveMe((1,2,3,4))) // four element tuple
println("===trigger the constructor patterns===")
println(echoWhatYouGaveMe(Person("Melissa", "Chan")))
println(echoWhatYouGaveMe(Person("Melissa", "Carter")))
println(echoWhatYouGaveMe(Dog("Suka")))
println(echoWhatYouGaveMe(Woodpecker))
println("===trigger the typed patterns===")
println(echoWhatYouGaveMe("Hello, world"))
println(echoWhatYouGaveMe(42))
println(echoWhatYouGaveMe(42F))
println(echoWhatYouGaveMe(Array(1,2,3)))
println(echoWhatYouGaveMe(Array("coffee", "apple pie")))
println(echoWhatYouGaveMe(Dog("Fido")))
println(echoWhatYouGaveMe(List("apple", "banana")))
println(echoWhatYouGaveMe(Map(1->"Al", 2->"Alexander")))
println(echoWhatYouGaveMe("33d"))
println()
val num = 25
num match {
case a if 10 to 19 contains a => println("10-19 range: " + a)
case b if 20 to 29 contains b => println("20-29 range: " + b)
}
val s = "foo"
try {
val i = s.toInt
}
catch {
case e: NumberFormatException => println(s"$s can't convert to int")
case e: Exception => e.printStackTrace
}
08-07
09-21
09-21
09-21
09-21