Skip to content

Latest commit

 

History

History
126 lines (89 loc) · 2.91 KB

01.起步.md

File metadata and controls

126 lines (89 loc) · 2.91 KB

01 起步

1 语法潜规则

① 如果一个方法(或一个函数)接受一个函数作为参数,那么可以直接传递一个方法作为参数(自动换为函数)

// 这里应用了`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)

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)

3 容器类 参数化数组、List、tuple、set、map

3.1 数组

val arr =  Array[String]("zhang san", "hill", "wangwu") <!-- 固定值 -->

val arr2 = new Array[String](10) <!-- 固定长度 -->

3.2 List 列表

不可变的 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 等

3.3 tuple 元组

对应数学终矢量的概念,可以包含不同类型的数据,scala支持最大的元组长度为22

val tp1 = (1,3, "lisi")
println(tp1._1)

3.4 set 集合 与 map 映射

默认都是不可变的

val set1 = Set[Int](2, 3, 4)
println(set1.contains(2))

val mp1 = Map(2 -> "li", 3 -> "wang", 4 -> "long")
println(mp1(2))