scala中的List

实现将List中的每一个元素都加上一个前缀。

方式一: 递归调用

def dec(list : List[Int], prefix : String) {
if (list != Nil) {
println(prefix + list.head)
dec(list.tail,prefix)
}
}

// Exiting paste mode, now interpreting.

dec: (list: List[Int], prefix: String)Unit

scala> dec (List(1,2,3,4,5),"***")
***1
***2
***3
***4
***5

方式二:for循环

def dec2(list:List[Int],prefix:String) {
for(num <- list) {
println(prefix + num)
}
}

// Exiting paste mode, now interpreting.

dec2: (list: List[Int], prefix: String)Unit

scala> dec2(List(1,2,3,4,5),"###")
###1
###2
###3
###4
###5

List集合的几个常用的方法:

//定义一个不可变List 

scala> val  l1 = List(1,2,3,4,5)
l1: List[Int] = List(1, 2, 3, 4, 5)

//实现List中所有元素累加求和

scala> l1.reduce(_+_)
res87: Int = 15

//从左向右,1-2-3-4-5 = -13。  

scala> l1.reduceLeft((a,b) => {
| println(s"a=${a} , b=${b}")
| a-b
| }
| )
a=1 , b=2
a=-1 , b=3
a=-4 , b=4
a=-8 , b=5
res88: Int = -13

//从右向左,(1-(2-(3-(4-5)))) = 3.

scala> l1.reduceRight((a,b) => {
| println(s"a=${a} , b=${b}")
| a-b
| }
| )
a=4 , b=5
a=3 , b=-1
a=2 , b=4
a=1 , b=-2
res89: Int = 3

//将a与b调换位置,得出的结果不同。

scala> l1.reduceRight((a,b) => {
| println(s"a=${a} , b=${b}")
| b-a
| }
| )
a=4 , b=5
a=3 , b=1
a=2 , b=-2
a=1 , b=-4
res91: Int = -5

如果我们写成最简洁的形式,得到的结果是3.

scala> l1.reduceRight(_-_)
res92: Int = 3

//fold在reduce的基础上多了一个参数,可以给一个初始值或者说起始值。

scala> l1.fold(0)((a,b) => {
| println(s"a=${a} , b=${b}")
| b-a
| }
| )
a=0 , b=1
a=1 , b=2
a=1 , b=3
a=2 , b=4
a=2 , b=5
res93: Int = 3

//这个例子更加清晰

scala> l1.fold(100)((a,b) => {
| println(s"a=${a} , b=${b}")
| b-a
| }
| )
a=100 , b=1
a=-99 , b=2
a=101 , b=3
a=-98 , b=4
a=102 , b=5
res96: Int = -97

//对比一下foldLeft 和 foldRight ,可以发现,foldLeft的第一个参数是累计值,而foldRight的第二个参数是累计值。

scala> l1.foldRight("***")((a,b) => {
| println(s"a=${a} , b=${b}")
| b+a+"#"
| }
| )
a=5 , b=***
a=4 , b=***5#
a=3 , b=***5#4#
a=2 , b=***5#4#3#
a=1 , b=***5#4#3#2#
res97: String = ***5#4#3#2#1#

scala> l1.foldLeft("***")((a,b) => {
| println(s"a=${a} , b=${b}")
| b+a+"#"
| }
| )
a=*** , b=1
a=1***# , b=2
a=21***## , b=3
a=321***### , b=4
a=4321***#### , b=5
res98: String = 54321***#####

scala> l1.foldLeft("***")((a,b) => {
| println(s"a=${a} , b=${b}")
| a+b+"#"
| }
| )
a=*** , b=1
a=***1# , b=2
a=***1#2# , b=3
a=***1#2#3# , b=4
a=***1#2#3#4# , b=5
res99: String = ***1#2#3#4#5#

//还有非常非常重要的map函数

scala> l1.map("age : " + _)
res101: List[String] = List(age : 1, age : 2, age : 3, age : 4, age : 5)

//filter函数

scala> l1.filter(_ >= 3)
res102: List[Int] = List(3, 4, 5)

//scala中 用 val l1 = List(1,2,3,4,5) 的方式创建出的集合是不可变集合,不能对集合元素做增删改的操作,否则会报错。

scala> l1 + 6
<console>:13: error: type mismatch;
found : Int(6)
required: String
l1 + 6
^

scala> l1
res104: List[Int] = List(1, 2, 3, 4, 5)

scala> l1(2) = 33
<console>:13: error: value update is not a member of List[Int]
l1(2) = 33

//可以用  :: 和 ::: 追加元素。但这不意味着改变了 l1 的集合元素,只是返回了一个新的集合。

scala> l1 ::: List(6)
res106: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> l1 :: List(7,8,9)
res110: List[Any] = List(List(1, 2, 3, 4, 5), 7, 8, 9)

scala> List(7,8,9) :: l1
res111: List[Any] = List(List(7, 8, 9), 1, 2, 3, 4, 5)

scala> l1
res107: List[Int] = List(1, 2, 3, 4, 5)











posted @ 2019-03-14 16:06  Rabbit624  阅读(520)  评论(0编辑  收藏  举报