欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[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)

 

 

相关标签: Scala