Scala学习笔记 -- 入门(二)
7.参数化
//值参数化
val big = new java.math.BigInteger("12345")
//类型参数化
val greetStrings = new Array[String](3)
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!
"
for (i <- 0 to 2)
println(greetStrings(i))
Scala中使用new来实例化对象或类的实例,并通过用值或类型来对其参数化。参数化意思是在创建实例时对实例做“配置”。
用值参数化,做法是在构造方法的括号中传入对象参数。用类型参数化,做法是在方括号里给出一个或多个类型。
注意,当你同时使用类型和值来参数化一个实例时,先是方括号包起来的类型,然后才是圆括号包起来的值。
greetString永远指向那个跟初始化时相同Array[String]实例,“可以”改变那个Array[String]元素,因此数组本身是可变的。
Scala从技术上讲并没有操作符重载,因为它实际上并没有传统意义上的操作符,这些字符都可以被用作方法名。
//apply方法调用
val res = 1 + 2
val res = (1).+(2)
//update方法调用
greetStrings(0) = "Hello"
greetStrings.update(0, "Hello")
数组是类的实例。
用一组圆括号将一个或多个值包起来,并将其apply到某个对象时,Scala会将这段代码转换成对这个对象的一个名为apply的方法的调用。
当通过圆括号应用了一个或多个参数的变量进行赋值时,编译器会将代码转换成对update方法调用,这个update方法接收两个参数:圆括号括起来的值,以及等号右边的对象。
Scala将从数组到表达式的一切都当作带有方法的对象来处理。
8.列表
//创建初始化一个列表
val oneTwoThree = List(1, 2, 3)
//列表拼接
val oneTwo = List(1, 2)
val twoThree = List(2, 3)
val threeFour = List(3, 4)
val oneTwoThreeFour = oneTwo ::: threeFour
val oneTwoThree = 1 :: twoThree
// twoThree.::(1)
val oneTwoThree = 1 :: 2 :: 3 ::Nil
对于需要拥有相同类型的对象的不可变序列的场景,可以使用Scala的List类。
“:::” => 列表拼接 ==> 创建并返回一个带有新值的新列表
“::” => cons => 在一个已有列表的最前面添加一个新的元素,并返回这个新的列表。
表示空列表的快捷方式是Nil。
注:
列表操作中,“:+” 追加操作所需时间随着列表的大小线性增加,而使用“::”在列表前面添加元素只需常量时间。
9.元组
val pair = (99, "Luftballons")
println(pair._1)
println(pair._2)
元组可以容纳不同类型的元素。要实例化一个新的元组,只需要将对象放在圆括号中,用逗号隔开。元素的实际类型取决于它包含的元素以及元素类型。
访问元组中元素不能像访问列表元素,其原因在于列表的apply方法永远只返回同一类型,但元组里的元素可以是不同类型的。
10.集与映射
Scala提供了两个子特质,一个用于表示可变集,一个用于表示不可变集。
// 创建、初始化及使用不可变集
var jetSet = Set("Boeing", "Airbus")
jetSet += "Lear"
println(jetSet.contains("Cessna"))
//创建、初始化及使用可变集
import scala.collection.mutable
val movieSet = mutable.Set("Hitch" ,"Poltergeist")
movieSet += "Shrek"
println(movieSet)
//创建 初始化及使用一个不可变HashSet
import scala.collection.immutable.HashSet
val hashSet = HashSet("Tomatoes" ,"Chilies")
println(hashSet + "Coriander")
//创建 初始化及使用一个可变映射
import scala.collection.mutable
val treasureMap = mutable.Map[Int, String]
treasureMap += (1 -> "Go to island.")
treasureMap += (2 -> "Find big X on ground.")
treasureMap += (3 -> "Dig.")
println(treasureMap(2))
def formatArgs(args:Array[String]) = args.mkString("
")
mkString方法可以被用于任何可被迭代访问的集合,返回一个包含了对所有元素调用toString的结果的字符串,以传入的字符串分隔。
val res = formatArgs(Array("zero", "one", "two"))
assert(res == "zero
one
two")
Scala的assert方法检查传入的Boolean,如果是false,则抛出AssertionError。如果是true,assert就返回。
11.文件操作
//引入scala.io包中Source类
import scala.io.Source
def widthOfLength(s:String) = s.length.toString.length
if(args.length > 0){
/*
toList是必需的,因为getLines()方法返回的是一个迭代器iteration,一旦完成遍历,迭代器就会被消耗掉。通过toList将它转化为List,即可通过内存存储所有行。
*/
val lines=Source.fromFile(args(0)).getLines().toList
/*
reduceLeft方法将传入的函数应用到lines的头两个元素,然后继续将这个传入的函数应用到前一步得到的值和lines中的下一个元素,直到遍历完整个列表后,reduceLeft将返回传入函数的最后一次执行结果。
*/
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
println(padding + line.length + " | " + line)
}
}
else
Console.err.println("Please enter filename: ")