[Scala] Scala 学习笔记 (1) - 基本语法
程序员文章站
2024-02-18 12:19:46
...
1. 什么是Scala
Scala是一门多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性,Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。
2. 为什么要学Scala
1) 优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验;
2) 速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会更快很多;
3) 能融合到Hadoop生态圈:Hadoop是现在大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但是Java做出来的API太丑,或者想实现一个优雅的API太费劲。
3. Scala语法
3.1 数据类型
Scala常用数据类型:
数字类型:Int/Long/Float/Double
字符类型:String
Boolean: 应用中一般采用Int类型0和1来做替换,可大大提升性能(生产中如果不是非用不可一般不使用)
scala> val age:Int = 18
age: Int = 18
scala> val money = 8888.88 // 不定义类型,它会自动推导出Double类型
money: Double = 8888.88
scala> val money = 8888.88f // 最后加一个字母f,它定义的是一个Float类型
money: Float = 8888.88
scala>
强制类型转换
scala> val money = 10.asInstanceOf[Double] // 强制转换成Double类型
money: Double = 10.0
scala>
类型判断
cala> val money = 10.isInstanceOf[Int]
money: Boolean = true
scala> val money = 10.isInstanceOf[Double]
money: Boolean = false
scala> val s = "abc".isInstanceOf[String]
s: Boolean = true
scala>
3.2 变量定义
val定义变量,变量定义之后不能重新被赋值。这是由Java的内存回收机制决定的。
scala> val i:Int = 100 // 定义变量时指定变量的数据类型
i: Int = 100
scala> val i = 100 // 可以不指定变量的数据类型,scala自动类型推导
i: Int = 100
scala> var msg:String = "hello"
msg: String = hello
scala> val msg = "hello"
msg: String = hello
var定义变量,变量可被重新赋值
scala> var msg:String = "hello"
msg: String = hello
scala> msg = "scala" // 变量定义之后可以再次被赋值
msg: String = scala
scala>
3.3 条件表达式
val i = 2
val m = if(i > 1) 100 else 0 // 最后一行为返回值
println(m)
val x = 100
val res = if (x > 0) true else false
println(res)
代码块实现,写法更复杂更不直观
val i = 2
val m = {
if (i > 1) {
100 // scala代码块里最后一行为返回值,相当于return 100
} else {
0
}
}
println(m)
条件判断
val i = -1
val m = if(i>0) 100 else 0
println(m)
当返回值类型不确定时,可以定义返回值类型为Any
val i = -1
val m:Any = if(i > 0) 100 else "error" // 条件也可以是混合类型;此处的Any可以省略
3.4 for循环
1 to 10 == 1.to(10):Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
1 until 10 == 1.until(10):Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
Range(1,10):Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
Range(1,10,2):Range(1, 3, 5, 7, 9) // 第三个参数是步长,步长不为0
迭代一个数组
for (i <- 1.to(10) if i % 2 == 0) {
println(i)
}
也可以用foreach
// 数组遍历
Array("aaa","bbb","ccc","ddd").foreach(ele => println(ele))
循环一个字符串
val str = "helloscala"
for (s <- str) println(s)
// 也可以用下标来循环
val str = "helloscala"
for (i <- 0.until(str.length)) println(str.charAt(i)) // strcharAt(n):下标
循环数组
// 增强循环
val a = Array(1,3,5,7,8,9)
for (i <- a) println(i)
// 也可以用下标来循环
for (i <-0.until(a.length)) println(a(i))
高级for循环
// 嵌套for循环,每个生成器都可以带一个条件
for (i <- 1.to(3); j <- 1.to(3) if i!=j) println(10*i+j)
for 推导式
如果for循环的循环体以yield开始,则该循环会构建出一个新的集合;用map方法可以实现同样的效果
// yield构建一个新的集合
val a = Array(1,2,3,4,5,6,7,8,9)
val b = for(i <- a) yield i * 10 // yield在for循环后生成一个新的集合
for (i <- b) println(i)
// map方法实现
val a = Array(1,2,3,4,5,6,7,8,9)
val b = a.map(_*10) // 这种方法实现的结果与上面等效
for (i <- b) println(i)
把array里面偶数乘以100组成新的集合输出
// 条件判断来筛选结果
val a = Array(1,2,3,4,5,6,7,8,9)
val b = for (i <- a if (i%2 == 0)) yield i * 100
for (i <- b) println(i)
// 也可以用filter方法过滤结果
val c = a.filter(i => i%2 == 0).map(_*100)
for (i <- c) println(i)
3.5 操作符重载
1 + 2 等价于1.+(2),其中+是一个方法
val i = 1 + 2
val j = 1.+(2)
if (i == j) println(true)
1 to 10 等价于1.to(10),其中to是一个方法
val i = 1 to 10
val j = 1.to(10)
if (i == j) println(true)