scala中的List
Posted rabbit624
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
以上是关于scala中的List的主要内容,如果未能解决你的问题,请参考以下文章