- ::: 运算符, 三个连续的冒号代表List的连接操作
val list1=List[Int](1,2,3,4,5)
val list2=List[Int](6,7,8,9,10)
val list3=list1:::list2
println(list3) //List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
//除此之外, 连接List还可以通过List.concat, concat的接收变量是*, 故不限制传入的List的数量, 不同类型的也可以
println(List.concat(List(1,2,3),List(4,5,6),List("a","b","c")))
//不过如果是Array的concat, 其只能传相同类型的Array
println(Array.concat(Array(1,2,3),Array(4,5,6),Array("a","b","c"))) //会报错
- :: 运算符, 该方法被称为cons, 即构造, 一般用来向List的头部追加元素, 无论该元素是什么类型, 其都将作为一个整体出现在List的头部
val list=1::(2::(3::Nil)) //List(1,2,3), 即嵌套连接, Nil为一个空的List, 即List[Nothing]
println(List(6,7,8)::list) //List(List(6, 7, 8), 1, 2, 3)
println(6::list) //List(6, 1, 2, 3)
//上述写法等价于(注意在.::后的元素需要用括号括起来)
println(list.::(List(6,7,8))) //List(List(6, 7, 8), 1, 2, 3)
println(list.::(6)) //List(6, 1, 2, 3)
- :+和+: 两者的区别在于, :+方法用于在尾部追加元素,+:方法用于在头部追加元素。其中 +: 和 :: 很类似,但是 :: 可以用于pattern match ,而+:则不行。关于+:和:+, 记住冒号永远靠近集合类型。
var list=(1::(2::(3::Nil)))
var new_list= (6) +: list .+: (8)
var super_list=new_list :+ list
println(new_list) //List(6, 8, 1, 2, 3)
println(super_list) //List(6, 8, 1, 2, 3, List(1, 2, 3))
- 四则运算 +-*/ , scala的概念是万物皆函数, 四则运算本身也是函数, 例如 1+2, 相当于是 1.+2, 即操作符本身就是函数, 1调用其加函数, 传入2作为参数。
val add=(_:Int)+(_:Int) //注意此处的下划线后需要声明类型, 因为此处无法自动推断类型
println(add(1,2)) //3
//而对于前缀操作符, 前缀操作符只支持+-!~四种, 如下:
-1
1.unary_-
+1
1.unary_+
!false
false.unary_!
~0xFF
0xFF.unary_~
- => 一般用于创建匿名函数实例, 相当于一个语法糖, x=>y 相当于输入x返回y
val list=List(("a",10),("b",5),("a",3),("b",7),("b",1),("a",2))
//下面的每一次=>都相当于一个匿名函数, 将list中的a和b分别求其总数, 其中reduce改为reduce(_+_)也行
val new_list=list.groupBy(x=>x._1).mapValues(x=>x.map(x=>x._2).reduce((x,y)=>x+y)).toList
new_list.foreach(println)
- -> 所有scala对象都有的方法, A->B就相当于返回一个二元组 (A,B)
println((3->5)) //(3,5)
for(a<-Array(1,2,3,4,5))println(a)
//替换某个变量
val add=(_:Int)+(_:Int)
Array(1,2,3,4,5).filter(_>3).foreach(println) //4,5
Array(1,2,3,4,5).reduce((x,y)=>x+y)
Array(1,2,3,4,5).reduce(_+_)
Array(1,2,3,4,5).sortWith(_>_) //Array[Int] = Array(5, 4, 3, 2, 1)
//替换整个参数列表
def sum(a:Int,b:Int,c:Int) = a + b + c
var a = sum _ //注意此处sum和下划线之间要有个空格
a(1,2,3)
//替换部分参数
var b = sum(1,_:Int,3)
println(b(2)) //6
//用在match-case中作为default case
val x=3
val result=x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
println(result) //many
//元组匹配
val t = (1, 3.1415, "ABC")
println(t._1) //1
println(t._2) //3.1415
println(t._3) //ABC
//将区间转化为参数序列
def sum(args:Int*)={
var result=0
args.foreach(x=>result+=x)
result
}
println(sum(1 to 5: _*)) //此处将1 to 5转化为了参数序列
//_*替换不需要的元素
val arr = Array(1,2,3,4,5)
val Array(one,two,_*)=arr
println(one,two) //(1,2), 即将Array中的1,2取出来赋值给one和two
//通配符
import scala.math._
//标识符, 无特殊含义
val _a=10