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

【scala 笔记(1)】 基础

程序员文章站 2024-02-18 12:14:58
...

简介

Scala是一门多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。

Scala 解释器

启动Scala解释器的步骤如下:
- 安装Scala (Linux 环境下先安装个Java环境, 再去官网下载个scala Unix版本,解压即可)
- 确保 scala/bin 目录位于系统PATH中(修改 .profile 文件配置, 添加scala 运行目录到PATH中)。

[email protected]:~/borey_zhu/scala$ cat ~/.profile 
 ....

JAVA_HOME=/home/prod/softwares/jdk1.8.0_60
export PATH=$JAVA_HOME/bin:$PATH

SCALA_HOME=/home/prod/softwares/scala/scala-2.12.2
export PATH=$SCALA_HOME/bin:$PATH
  • 重新加载下环境变量运行 scala 命令即可进入Scala 解释器中
[email protected]:~/borey_zhu/scala$ scala
Welcome to Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).
Type in expressions for evaluation. Or try :help.

scala> println("hello scala")
hello scala

ok, scala 环境搞定!

编写一个简单的Scala程序

// Hello.scala
object Hello{
  def main(args: Array[String]){
    println("hello borey")
  }
}

编译&运行

prod@AWS-TEST-DT:~/borey_zhu/scala$ scalac Hello.scala 
prod@AWS-TEST-DT:~/borey_zhu/scala$ scala Hello
hello borey

变量定义

Scala 有两种变量, val 和 var 。 val 类似于Java 中的final 变量。 一旦初始化了, val就不能再被赋值。 var 如同 Java 里 非final变量, 可以在它的生命周期中被对次赋值:

scala> val a = 1
a: Int = 1

scala> a =2  // error
<console>:12: error: reassignment to val
       a =2
         ^

scala> var b = 1
b: Int = 1

scala> b =3 // ok
b: Int = 3

scala 具备 类型推导 能力, 不必像 Java/C++ 必须进行类型声明 (C++ 11 开始也具备了类型推导的能力 )。

基本类型

Scala 中有如下几种基本类型, 除了String 归于 java.lang包之外, 其余所有的基本类型都是包 scala的成员。 如: Int => scala.Int 。 由于包scala 和java.lang 的所有成员都被每个scala 源文件自动引用, 因此可以在任何地方使用简化名。

值类型 范围
Byte 8 位有符号补码整数 ( $-2^7$ ~ $2^7 -1$)
Short 16 位有符号补码整数 ( $-2^{15}$ ~ $2^{15} -1$)
Int 32 位有符号补码整数 ( $-2^{31}$ ~ $2^{31} -1$)
Long 64 位有符号补码整数 ( $-2^{63}$ ~ $2^{63} -1$)
Char 16 位无符号Unicode字符( 0 ~ $2^{16} -1$)
String char 序列
Float 32位 IEEE754单精度浮点数
Double 64位 IEEE754单精度浮点数
Boolean true or false

操作符和方法

Scala 为基本类型提供了丰富的操作符集(其实操作符实际只是普通方法调用的另一种表现形式):

scala> val (a, b) = (1, 2)
a: Int = 1
b: Int = 2

scala> a+b
res0: Int = 3

scala> a.+(b)  // 方法调用
res1: Int = 3

此符号 + 是操作符, 更明确的说,是中缀操作符。 操作符标注不仅限于像 + 这种其他语言里看上去像操作符的东西, 在Scala 中任何方法都可以被当做操作符来标注

例如:java.lang.String

scala> val s: java.lang.String = "abc"
s: String = abc

scala> s split 'b'
res4: Array[String] = Array(a, c)

函数调用

除了方法之外, Scala 还提供函数。 使用也更为简单
例如:

scala> import math._ // _ 字符是 通配符, 类似Java 中的 *
import math._

scala> abs(-1)
res5: Int = 1

scala> sqrt(4)
res6: Double = 2.0

Scala 没有静态方法, 不过他有个类似的特性:单例对象(后续会了解到)。 通常一个类对应有一个伴生对象, 其方法就和Java中的静态方法一样。

常用的控制结构

  • 条件表达式 if {} else {}
scala> val a = if (b > 1) 10 else 20 // 等效 Java/C++  b > 1? 10:20
a: Int = 10
  • 块表达式 {}
scala> val a = { val x=10; val y=100; x*y}
a: Int = 1000
  • 循环 while(condition) { ... } , for (range){...}
    后续会更深入了解
scala> while(a>0) {println(a); a-=1;}
2
1

scala> for( i <- 1 to 3){println(i)}
1
2
3
  • 懒值 lazy

    使用lazy声明的变量会被推迟初始化, 直到我们首次使用

scala> lazy val a = { val x=10; val y=100; println(x + ", " + y); x*y} //这里未必初始化
a: Int = <lazy>

scala> println(a)
10, 100     // 初次使用进行初始化 打印输出
1000

scala> println(a)
1000
  • 异常 try {} catch {}

// 异常捕获的语法使用的是模式匹配语法,后续会了解到
scala> try{
     |     1/0
     |   }catch {
     |     case ex: ArithmeticException =>  
     |       println("除0 ... " + ex)
     |     case _ : Exception =>
     |       println("ignore")
     |   }
除0 ... java.lang.ArithmeticException: / by zero
res15: AnyVal = ()

// 抛出异常采用 throw new ExceptionClass( ... )

常用的集合

简单介绍下常用的集合使用:

  • 元组 Tuple
scala> val a = (1,2)
a: (Int, Int) = (1,2)

scala> a.getClass
res21: Class[_ <: (Int, Int)] = class scala.Tuple2$mcII$sp

scala> val b = (1,"2", 3.0)
b: (Int, String, Double) = (1,2,3.0)

scala> b.getClass
res22: Class[_ <: (Int, String, Double)] = class scala.Tuple3

scala> a._1
res28: Int = 1

scala> b._3
res27: Double = 3.0
  • 数组 Array
scala> val a = Array(1,2)
a: Array[Int] = Array(1, 2)

scala> a.foreach(println)
1
2
  • 列表 List
scala> var a = 1::2::Nil  // Nil 结束符
a: List[Int] = List(1, 2)

scala> var b = 3::4::Nil
b: List[Int] = List(3, 4)

scala> a::b  //  理解为 a.::(b) 就可了
res42: List[Any] = List(List(1, 2), 3, 4)

scala> b::a
res43: List[Any] = List(List(3, 4), 1, 2)

scala> a++b // 合并
res45: List[Int] = List(1, 2, 3, 4)

scala> a:::b
res46: List[Int] = List(1, 2, 3, 4)

scala> a(1)
res48: Int = 2
  • 映射 Map
scala> var d = Map(1->2 , 3->4)
d: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)

scala> d.get(1)  // 取值
res49: Option[Int] = Some(2)

scala> d.get(3)
res50: Option[Int] = Some(4)

scala> d.get(2) // 不存在 返回None
res51: Option[Int] = None

scala> d.getOrElse(7, 10) // 不存在 返回 默认值
res58: Int = 10

scala> d += (5->6) // 添加

scala> d
res54: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4, 5 -> 6)

scala> d -= 3     // 删除

scala> d
res56: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 5 -> 6)

更多API的使用可以查看官方文档, 注意引用scala.collection.immutablescala.collection.mutable 集合间的区别。