3 Next Steps in Scala

• Step 1. Use lists
• Step 2. Use tuples
• Step 3. Use sets and maps
• Step 4. Learn to recognize the functional style
• Step 5. Read lines from a file

• // In file next-steps/Ex1.scala val big = new java.math.BigInteger("12345")
// In file next-steps/Ex1.scala val greetStrings = new Array[String](3) greetStrings(0) = "Hello" greetStrings(1) = ", " greetStrings(2) = "world!\n" for (i <- 0 to 2) print(greetStrings(i))
// In file next-steps/Ex2.scala val greetStrings: Array[String] = new Array[String](3)
// In file next-steps/Ex2.scala greetStrings(0) = "Hello" greetStrings(1) = ", " greetStrings(2) = "world!\n"
// In file next-steps/Ex2.scala for (i <- 0 to 2) print(greetStrings(i))
greetStrings(0) = "Hello"
greetStrings.update(0, "Hello")
// In file next-steps/Ex3.scala val greetStrings = new Array[String](3) greetStrings.update(0, "Hello") greetStrings.update(1, ", ") greetStrings.update(2, "world!\n") for (i <- 0.to(2)) print(greetStrings.apply(i))
// In file next-steps/Ex3.scala val numNames = Array("zero", "one", "two")
// In file next-steps/Ex3.scala val numNames2 = Array.apply("zero", "one", "two")

Step 1. Use lists

// In file next-steps/Ex3.scala val oneTwoThree = List(1, 2, 3)
// In file next-steps/Ex3.scala val oneTwo = List(1, 2) val threeFour = List(3, 4) val oneTwoThreeFour = oneTwo ::: threeFour println(""+ oneTwo +" and "+ threeFour +" were not mutated.") println("Thus, "+ oneTwoThreeFour +" is a new list.")
List(1, 2) and List(3, 4) were not mutated. Thus, List(1, 2, 3, 4) is a new list.
// In file next-steps/Ex3.scala val twoThree = List(2, 3) val oneTwoThree = 1 :: twoThree println(oneTwoThree)
List(1, 2, 3)
// In file next-steps/Ex3.scala val oneTwoThree = 1 :: 2 :: 3 :: Nil println(oneTwoThree)

Step 2. Use tuples

// In file next-steps/Ex3.scala val pair = (99, "Luftballons") println(pair._1) println(pair._2)
99 Luftballons

Step 3. Use sets and maps

// In file next-steps/Ex3.scala var jetSet = Set("Boeing", "Airbus") jetSet += "Lear" println(jetSet.contains("Cessna"))
// In file next-steps/Ex3.scala jetSet = jetSet + "Lear"
// In file next-steps/Ex3.scala import scala.collection.mutable.Set val movieSet = Set("Hitch", "Poltergeist") movieSet += "Shrek" println(movieSet)
// In file next-steps/Ex3.scala import scala.collection.immutable.HashSet val hashSet = HashSet("Tomatoes", "Chilies") println(hashSet + "Coriander")
// In file next-steps/Ex3.scala import scala.collection.mutable.Map val treasureMap = Map[Int, String]() treasureMap += (1 -> "Go to island.") treasureMap += (2 -> "Find big X on ground.") treasureMap += (3 -> "Dig.") println(treasureMap(2))
Find big X on ground.
// In file next-steps/Ex3.scala val romanNumeral = Map( 1 -> "I", 2 -> "II", 3 -> "III", 4 -> "IV", 5 -> "V" ) println(romanNumeral(4))

Step 4. Learn to recognize the functional style

// In file next-steps/Ex3.scala def printArgs(args: Array[String]): Unit = { var i = 0 while (i < args.length) { println(args(i)) i += 1 } }
// In file next-steps/Ex3.scala def printArgs(args: Array[String]): Unit = { for (arg <- args) println(arg) }
// In file next-steps/Ex3.scala def printArgs(args: Array[String]): Unit = { args.foreach(println) }
// In file next-steps/Ex3.scala def formatArgs(args: Array[String]) = args.mkString("\n")
// In file next-steps/Ex3.scala println(formatArgs(args))
// In file next-steps/Ex3.scala val res = formatArgs(Array("zero", "one", "two")) assert(res == "zero\none\ntwo")

Step 5. Read lines from a file

// In file next-steps/countchars1.scala import scala.io.Source if (args.length > 0) { for (line <- Source.fromFile(args(0)).getLines) print(line.length +" "+ line) } else Console.err.println("Please enter filename")
\$ scala countchars1.scala countchars1.scala
23 import scala.io.Source 1 23 if (args.length > 0) { 1 50 for (line <- Source.fromFile(args(0)).getLines) 36 print(line.length +" "+ line) 2 } 5 else 47 Console.err.println("Please enter filename")
23 | import scala.io.Source 1 | 23 | if (args.length > 0) { 1 | 50 | for (line <- Source.fromFile(args(0)).getLines) 34 | print(line.length +" "+ line) 2 | } 5 | else 47 | Console.err.println("Please enter filename")
// In file next-steps/Ex5.scala val lines = Source.fromFile(args(0)).getLines.toList
// In file next-steps/Ex5.scala def widthOfLength(s: String) = s.length.toString.length
// In file next-steps/Ex4.scala var maxWidth = 0 for (line <- lines) maxWidth = maxWidth.max(widthOfLength(line))
// In file next-steps/Ex5.scala val longestLine = lines.reduceLeft( (a, b) => if (a.length > b.length) a else b )
// In file next-steps/Ex5.scala val maxWidth = widthOfLength(longestLine)
// In file next-steps/Ex5.scala for (line <- lines) { val numSpaces = maxWidth - widthOfLength(line) val padding = " " * numSpaces print(padding + line.length +" | "+ line) }
// In file next-steps/Ex6.scala import scala.io.Source def widthOfLength(s: String) = s.length.toString.length if (args.length > 0) { val lines = Source.fromFile(args(0)).getLines.toList val longestLine = lines.reduceLeft( (a, b) => if (a.length > b.length) a else b ) val maxWidth = widthOfLength(longestLine) for (line <- lines) { val numSpaces = maxWidth - widthOfLength(line) val padding = " " * numSpaces print(padding + line.length +" | "+ line) } } else Console.err.println("Please enter filename")