Scala学习笔记


前言

Scala是一个多范式语言,其支持面向对象与函数式编程。

Scala具有一些特性:

  • 同时支持命令式风格和类型推断
  • 纯面向对象
  • 强制合理的静态类型和类型推断
  • 简洁而富有表现力
  • 能和Java无缝的交互
  • 基于精小的内核构建
  • 高度的伸缩性,仅用少量代码就可以创建高性能的应用程序
  • 具有强大、易用的并发模型

安装

brew install coursier/formulas/coursier && cs setup

探索Scala

Scala不要求以;结尾。

object HelloWorld{
  def main(args: Array[String]){
    println("Hello World...")
  }
}

上面的HelloWorld代码与Java最大的不同在于:Scala版的HelloWorld程序不通过static关键字把main方法标记成静态方法,而是使用object关键字创建了单件。

<10>.asInstanceOf[Double]:Int类型的10转换成Double类型

10.isInstanceOf[Int]:返回10是否为Int类型

val vs var

val:值

final修饰

val 值名称:类型= xxx

var:变量

可以使用lazy关键字描述 定义惰性加载,实现懒加载。不加lazy是立即实例化,但是使用lazy则在使用时实例化。

使用lazy只有在使用时才执行,可能导致错误不易被发现,需要注意。

常见基本类型

数据类型 描述
Byte 8位有符号补码整数。数值区间为 -128 到 127
Short 16位有符号补码整数。数值区间为 -32768 到 32767
Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754 标准的单精度浮点数
Double 64 位 IEEE 754 标准的双精度浮点数
Char 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF
String 字符序列
Boolean true或false
Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Null null 或空引用
Nothing Nothing类型在Scala的类层级的最底端;它是任何其他类型的子类型。
Any Any是所有其他类的超类
AnyRef AnyRef类是Scala里所有引用类(reference class)的基类

函数定义

def 函数名(参数名: 类型, 参数名: 类型=默认值): 返回类型={
    // todo
    // 方法体内的最后一行为返回值,不需要return
}

上面的形式中方法体如果可以一行表示,可以在=后直接书写,而不加{}。对于没有入参的的函数,调用时可以不给()。使用默认参数也是有入参的,不能直接使用函数名调用。

可变参数:args:String*,使用时for(a<-args){}类似auto或者range

循环

scala支持几种循环的方式,大多都是依赖Range去实现:

  • Range:Range(1,10,2)1 3 5 7 9,step不能是0
  • to:左闭右闭 1 to 10或者1.to(10)
  • until:左闭右开
  • foreach
  • while
  • for
for(i <- 1 to 10 if i%2==0){
    // todo
}
arr.foreach(item=>println(item))

Class

class 类名{
    //属性
    var 
    val
}

def main(args:Array[String]):Uint{
    val a=new 类名
}

对于没有需要明确初始化值的变量,可以直接使用 ,其本身只表示是一个占位符。使用占位符必须给明类型。String类型占位符对应的是null。

针对class中没有修饰的val,scala会自动生成对应的get方法。

针对class中没有修饰的var,scala会自动生成对应的get/set方法。

但是有private [this]修饰的类外无法直接访问。

主构造器

主构造器写在类定义后面,且在类中的语句在每一个相应对象创建的时候就会执行,除了函数定义。

主构造器支持三种形式的形参:

  • 不使用任何修饰:在类内部使用,逻辑上不是一个成员,外部不能使用。
  • var修饰:属于类成员,为变量。调用时入参直接赋值给该成员。
  • val修饰:属于类成员,为常量。调用时入参直接赋值给该成员。

不加参数列表相当于为空,()可以省略。

主构造器的访问修饰符添加到参数列表前。

辅助构造器

辅助构造器必须用this定义。

辅助构造器必须直接或者间接调用主构造器,调用其他构造必须位于第一行。

主构造器和辅助构造器是重载的方法,所以参数列表不能一致。

Tip

个人觉得学习Scala有一个隐形前提,就是需要会Java。在学习Scala的道路上,常用反编译成Java可能更容易的理解Scala,螺旋式上升。

本博客为《Scala实用指南》以及网络博客组合整理与总结,仅供个人学习复习使用。


文章作者: 不二
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不二 !
  目录