Scala编程-第3章 Scala入门再探- 高飞网

第3章 Scala入门再探

2017-03-16 20:11:03.0

第七步 使用类型参数化数组(Array)


val array1 = Array(1,2,3,4,5)
array1.foreach(println)

 元素赋值

array1(0)='a'
array1(1)='b'
array1(2)='c'

scala与java中数组的不同在于用圆括号而不是方括号进行访问

声明数组的也可以写全为:

val array2:Array[String]=new Array[String](3)


第八步 使用列表(List)

    Scala中List是不可变的,是为实现函数式编程而设计的。如下初始化List

var list1 = List(1,2,3,3,4,5)
list1.foreach(print)

    对某个List调用方法时,似乎这个列表发生了改变,而实际上只是用新的值重建然后再返回。如List的叠加,用三个冒号“:::”

var list2 = List(6,7,8,9)
var list3 = list1:::list2

    操作符两个冒号“::”,发间为"cons",它可以把新元素组合到现有列表的最前端

var list4 = 0::list3

    因为Nil是空列表的简写,因此可以使用cons操作符把所有元素串起来,形成新列表

var list5 = 1::2::3::4::Nil
list5.foreach(print)


为什么列表不支持添加(append)操作?

    List类没有提供append操作,因为随着列表的变长,append耗时将呈线性增长,而使用::做前缀则仅耗用固定时间。如果适合你通过添加元素来构造列表,则把它们前缀进去,完成之后再调用reverse,或使用ListBuffer,一种提供append的可变列表,完成之后调用toList

val listBuf = scala.collection.mutable.ListBuffer(1)
listBuf+=2
listBuf.append(3)
listBuf.append(4)
listBuf.append(5)
listBuf.toList.foreach(print)


List的方法和作用

方法名方法作用
List()或Nil空List
List("Cool", "tools", "rule")创建带有三个值“Cool”,“tools”,和“rule”的新List[String]
val thrill = "Will" :: "fill" :: "until" :: Nil创建带有三个值“Will”,“fill”和“until”的新List[String]
List("a", "b") ::: List("c", "d")叠加两个列表(返回带"a", "b", "c", "d"的新List[String])
thrill(2)返回在thrill列表上索引为2(基于0)的元素("until")
thrill.count(s => s.length == 4)计算长度为4的String元素个数(2)
thrill.drop(2)返回去掉前两个元素的thrill列表(List("until"))
thrill.dropRight(2)返回去掉后两个元素的thrill列表(List("Will"))
thrill.exists(s => s == "until")判断是否有值为"until"的字符串元素在thrill里(true)
thrill.filter(s => s.length == 4)返回长度为4的元素依次组成的新列表(List("Will, "fill"))
thrill.forall(s => s.endsWith("1"))判断是否thrill列表里所有元素都以"1"结尾(true)
thrill.foreach(s => print(s))对thrill列表每个字符串执行print语句("Willfilluntil")
thrill.foreach(print)与前相同,不过更简洁(同上)
thrill.head返回thrill列表的第一个元素("Will")
thrill.init返回thrill列表除最后一个以外其他元素组成的列表(List("Will", "fill"))
thrill.isEmpty返回thrill列表是否为空(false)
thrill.last返回thrill列表的最后一个元素("until")
thrill.length返回thrill列表的元素数量(3)
thrill.map(s => s + "y")返回由thrill列表里每一个String元素都加了"y"构成的列表(List("Willy", "filly", "untily"))
thrill.mkString(", ")返回用列表的元素组成的字符串("Will, fill, until")
thrill.remove(s => s.length == 4)返回去除了thrill列表中长度为4的元素后的元素依次组成的新列表(List("until"))
thrill.reverse返回由thrill列表的元素逆序组成的新列表(List("until", "fill", "Will"))
thrill.sort((s, t) => s.charAt(0).toLowerCase < t.charAt(0).toLowerCase)返回thrill列表元素按照第一个字符的字母小写排序之后依次组成的新列表(List("fill", "until", "Will"))
thrill.tail返回thrill列表中除第一个元素之外依次组成的新列表(List("fill", "until"))


第九步 使用元组(Tuple)

    元组也是很有用的容器对象。与列表一样,元组也是不可变的;但不同的是,元组可以包含不同类型的元素。

var pair=ezhangsan",3)
println(pair._1)
println(pair._2)

    有了元组可以在函数中返回多个值了。


第十步 使用集(set)和映射(map)

    Scala的集合库区分可变型和不可变型。

var jetSet=Set("Boeing","Aribus")
jetSet+="Lear"
jetSet.foreach(println)

    上面的方法创建的是不可变集。

    下面是可变集

var movieSet=scala.collection.mutable.Set("Hitch","Poltergeist")
movieSet+"Shrex"
movieSet.foreach(println)



    map与set类似,也实现了可变与不可变型两种


var treasuerMap = Map[Int,String]()
treasuerMap+=(1->"Go to island")
treasuerMap+=(2->"Pind big X on ground")
treasuerMap+=(3->"Dig")

println(treasuerMap)


第十一步 学习识别函数式风格


首先尝试不使用任何var编程,只使用val。下面用函数式风格打印数组 

def printArgs(args:Array[String]):Unit={
    args.foreach(println)
}

不产生副作用的函数

def formatArgs(args:Array[String])=args.mkString("*\n")
print(formatArgs(args))


第十二步 从文件里读取文本行


import scala.io.Source
var lines = Source.fromFile("file.scala").getLines
lines.foreach(println)