Scala学习(除列表集合等)
Idea配置安装
进入idea后,选取file中的setting选项,在plugins中安装scala,之后重启idea。
右键点击项目,选取Add Framework Support,并选取对应的scala版本
新建文件夹,并将文件夹改为source Root
之后,即可创建scala.class了
变量
变量声明时,类型可以省略,编译器可自动进行类型推导
字符串变量替换
Scala中基础的字符串插值就是在字符串前加字幕‘s’,然后在字符串中放入变量,每个变量都应以‘$’开头。
字符串多行输出
三引号表示字符串,保持多行字符串的原格式输出
文件读写
数据类型
Scala中数据分为两大类:数值类型和引用类型,他俩都是对象,都是Any的子类
StringOps是对Java中的String的增强
Unit:对应java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是一个数据类型,只有一个对象就是();而void不是数据类型,它只是一个关键字
数值类型转换
1:自动提升原则:有多种类型的数据进行混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算
2:把精度大的数值类型赋值给精度小的数值类型时,就会报错,因此需要进行强转(精度可能会降低或溢出);反之就会进行自动类型转换
3:(byte、short)和 char 之间不会相互自动转换
4:byte,short,char三者可以计算,在计算时首先转换为int类型
流程控制
if拓展——三目运算符拓展
for循环——普通
for循环——range
循环守卫——代替java中的continue
循环步长
循环中断
函数式编程
解决问题时,将问题分解成一个一个的步骤,将每个步骤进行封装(函数),通过调用这些封装好的步骤,解决问题
函数基础语法
scala自动将函数的最后一行的值作为返回值,省略return;{}中只有一行语句可省略{}
可变参数个数的函数定义
高阶函数
/** * 高阶函数 * 函数的参数是函数 * 函数的返回值是函数 */ def fun1(a:Int, f:(Int,Int) => Int)= { var result = f(4, 4) print("----------") a * result } def sum(a:Int, b:Int): Int = { a + b } println(fun1(5, sum)) //--------40 def fun3(a:Int, b:Int): (String, String)=>String = { def fun4(c: String, d: String) = { a + b + c + d } fun4 } val function = fun3(1, 2) println(function("3", "4")) // 334
以下等同于fun4(_, _)(1,2)
对象
scala中没有public,一个.scala中可以写多个类
@BeanProperty——可自动生成Java中的get/set方法
访问权限
继承、多态——override
当一个类extends另外一个类的时候,override的规则基本如下:
1:子类中的方法要覆盖父类中的方法,必须写override
2:子类中的属性val要覆盖父类中的属性,必须写override
3:父类中的变量不可以覆盖
抽象类不需要用override
特质
1:当一个类继承其它类,且具有某个特质时,若继承的类与特质中的变量有重复,则需要在该类中用override重写该变量
Trait函数多重叠加,会从后往前执行方法
object Test15_TraitOverlying { def main(args: Array[String]): Unit = { val student = new Student15 student.increase() // 输出knowledge increased } } trait KnowLedge15 { var amount: Int = 15 def increase(): Unit = { println("knowledge increased") } } trait Telent15 { def singing(): Unit def dancing(): Unit def increase(): Unit = { println("talent increased") } } class Student15 extends Person13 with Telent15 with KnowLedge15 { override def dancing(): Unit = println("dancing") override def increase(): Unit = super.increase() override def singing(): Unit = println("singing") }
泛型
协变和逆变
class MyList[+T] // 协变
class MyList[-T] // 逆变
协变:Son是Father的子类,则MyList[Son]也作为MyList[Father]的“子类”
逆变:Son是Father的子类,则MyList[Son]作为MyList[Father]的“父类”
上下限
泛型上下限的作用是对传入的泛型进行限定
Class PersonList[T<:Person] // 泛型上限
Class PersonList[T>:Person] // 泛型下限
Class PersonList[T>:Person] // 泛型下限