[Scala] Scala 学习笔记 (1) - 基本语法

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)

猜你喜欢

转载自blog.csdn.net/wawa8899/article/details/80976206