① 如果一个方法(或一个函数)接受一个函数作为参数,那么可以直接传递一个方法作为参数(自动换为函数)
// 这里应用了`eta 展开`进行自动转换,方法转函数
args.foreach(println)
等价于
//用后缀下划线,手动将方法转换成函数(如果该方法没有重载方法)
args.foreach(println _)
foreach 源码参考
def foreach[U](f: A => U): Unit = {
var i = 0
val len = length
while (i < len) { f(this(i)); i += 1 }
}
② 如果一个方法没有参数(后缀表示法)或只有一个参数(中缀表示法),可省略括号与点。比如 2 abs
求绝对值;又比如 for(i <- 1 to 3)
,这里的 1 to 3
相当于 (1).to(3)
③ 一个对象实例的 arr(1)
方法是 apply(x:Int) 的省略,arr(1) = 3
方法是 update(x:Int, y:Int) 的省略
④ 以:结尾的操作符都是右操作符,比如 7 :: li 等价于 li.::(7), 又或者 5 +: li
⑤ 包含有两个参数的类型的中缀表达式,只能用于类型表示,不可用于初始化。初始化需要额外提供一个方法。 比如
val with1: String With Int = With("Bar", 2)
- 索引循环 while 语句
- for / foreach 循环表达式
val arr = Array("zhang san", "lisi", "wangwu")
var i = 0
val len = arr.length
while (i < len) {
println(arr(i))
i += 1
}
val arr = Array("zhang san", "lisi", "wangwu")
for (elem <- arr) {
println(elem)
}
args.foreach(println)
val arr = Array[String]("zhang san", "hill", "wangwu") <!-- 固定值 -->
val arr2 = new Array[String](10) <!-- 固定长度 -->
不可变的 List,添加元素操作会生成新的 List
val lt1 = List[Int](2,3,4)
val lt3 = 5 :: lt2 //51234 前添加
val lt6 = lt3 ::: lt4 //5123412346 前添加(添加列表)
// prepended 与 appended 别名,返回新的列表
val lt2 = 1 +: lt1 //1234
val lt4 = lt2 :+ 6 //12346
//concat 别名
val lt5 = lt3 ++ lt4 //5123412346
可变 List
val ml = new mutable.ListBuffer[Int]()
// ml 实现了 SqlLike,因此有 +:, :+ 方法。虽然没有 :: 与 ::: 方法,但是有 += 与 ++= 方法,另外还有 ++ 方法,用于生成新的列表
ml += 5 // addOne
3 +=: l // prepend
ml(1) = 1
Scala 的 List 类还定义了其它很多很有用的方法,比如 head、last、length、reverse、tail 等
对应数学终矢量的概念,可以包含不同类型的数据,scala支持最大的元组长度为22
val tp1 = (1,3, "lisi")
println(tp1._1)
默认都是不可变的
val set1 = Set[Int](2, 3, 4)
println(set1.contains(2))
val mp1 = Map(2 -> "li", 3 -> "wang", 4 -> "long")
println(mp1(2))