文章目录
一、基本操作二、分组groupBy三、排序sort四、映射map五、迭代iterator六、归约reduce七、折叠fold八、其他操作九、WordCount十、模式匹配
一、基本操作
val list
= List
(1, 2, 3, 4, 1)
println
("sum = " + list
.sum
)
println
("max = " + list
.max
)
println
("min = " + list
.min
)
println
("product = " + list
.product
)
println
("reverse = " + list
.reverse
)
println
("mkString = " + list
.mkString
(","))
println
("集合前3位 = " + list
.take
(3))
二、分组groupBy
val list
= List
(1, 2, 3, 4, 1)
val intToInts
: Map
[Int, List
[Int]] = list
.groupBy
(x
=> x
)
println
(intToInts
)
val stringList
= List
("11", "12", "21", "22")
val stringToStrings
: Map
[String, List
[String]] = stringList
.groupBy
(s
=> s
.substring
(0, 1))
println
(stringToStrings
)
三、排序sort
val list
= List
(1, 2, 3, 4, 1)
val ints
= list
.sortBy
(x
=> x
)
println
(ints
)
val ints1
= list
.sortWith
((n1
, n2
) => n1
> n2
)
println
(ints1
)
四、映射map
通过map映射操作来解决将集合中的元素通过指定函数映射成新的结果集合,以HashSet为例说明:
集合类型都有这个map映射函数[B]是泛型,HashSet[B]就是返回的新的集合map()是一个高阶函数(可以接受一个函数的函数,就是高阶函数),可以接收函数 f: (A) => B
val list
= List
(1, 2, 3, 4, 1)
val tuples
: Seq
[(Int, Int)] = list
.map
(x
=> (x
, 1))
println
(tuples
)
val wc
= tuples
.groupBy
(x
=> x
._1
).map
(x
=> (x
._1
, x
._2
.size
))
println
(wc
)
扁平化操作flatmap
val lineList
= List
("Hello World", "Hello Scala", "Hello Spark")
val strings
: Seq
[String] = lineList
.flatMap
(x
=> x
.split
(" "))
println
(strings
)
五、迭代iterator
val list
= List
(1, 2, 3, 4)
val itr
= list
.iterator
while (itr
.hasNext
) {
print
(itr
.next
() + " ")
}
println
("")
val itr2
= list
.iterator
for (item
<- itr2
) {
print
(item
+ " ")
}
六、归约reduce
val list
= List
(1, 2, 3, 4)
println
(list
.reduce
((n1
, n2
) => n1
+ n2
))
println
(list
.reduce
(_
+ _
))
println
(list
.reduceLeft
(_
+ _
))
println
(list
.reduceRight
(_
+ _
))
七、折叠fold
val i
= list
.fold
(5)(_
- _
)
val i2
= list
.foldLeft
(5)(_
- _
)
val i3
= list
.foldRight
(5)(_
- _
)
val map1
= mutable
.Map
("a" -> 1, "b" -> 2, "c" -> 3)
val map2
= mutable
.Map
("a" -> 3, "c" -> 2, "d" -> 1)
val stringToInt
= map1
.foldLeft
(map2
)((map
, t
) => {
map
(t
._1
) = map
.getOrElse
(t
._1
, 0) + t
._2
map
})
println
(stringToInt
)
八、其他操作
val ints2
= list
.filter
(x
=> x
% 2 == 0)
println
(ints2
)
val list1
= List
(1, 2, 3)
val list2
= List
(3, 4, 5, 6)
val tuples1
: Seq
[(Int, Int)] = list1
.zip
(list2
)
println
(tuples1
)
val ints3
: Seq
[Int] = list1
.union
(list2
)
println
(ints3
)
val ints4
: Seq
[Int] = list1
.intersect
(list2
)
println
(ints4
)
val ints5
: Seq
[Int] = list1
.diff
(list2
)
println
(ints5
)
九、WordCount
val lineList
= List
(("Hello Scala World", 4), ("Hello World", 3), ("Hello Spark", 2), ("Hello Flink", 1))
val tuples
: Seq
[(String, Int)] = lineList
.flatMap
(x
=> {
val words
: Array
[String] = x
._1
.split
(" ")
words
.map
(w
=> (w
, x
._2
))
})
println
(tuples
)
val stringToTuples
= tuples
.groupBy
(t
=> t
._1
)
println
(stringToTuples
)
val wordCount
= stringToTuples
.map
(t
=> (t
._1
, t
._2
.map
(t
=> t
._2
).sum
))
println
(wordCount
)
println
(stringToTuples
.mapValues
(t
=> t
.map
(tt
=> tt
._2
).sum
))
val tuples1
= wordCount
.toList
.sortWith
((left
, right
) => left
._2
> right
._2
)
println
(tuples1
)
十、模式匹配
scala中的模式匹配类似于Java中的switch语法,但是更加强大。
例:
val oper
= '+'
val n1
= 10
val n2
= 20
var res
= 0
oper
match {
case '+' => res
= n1
+ n2
case '-' => res
= n1
- n2
case '*' => res
= n1
* n2
case '/' => res
= n1
/ n2
case _
=> println
("error")
}
println
("res = "+ res
)
说明:
如果所有case都不匹配,那么执行case _分支,类似于Java中default语句;又没有写case _分支,那么会抛出MatchError每个case中,不用break语句,自动中断case=>类似于java swtich的:,=>后面的代码块到下一个case, 是作为一个整体执行,可以使用{}括起来,也可以不括。可以在match中使用其它类型,而不仅仅是字符,可以是表达式