scala小记

1.数据类型

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

 

2.字面量(常量值)

var为可变变量,val为不可变变量(常量),变量必须被初始化

val a=10:a为常量不可更改,10为字面量

var b=9:b为变量可以更改,9为字面量

1.整数字面量(十进制与十六进制)  十进制:10  十六进制:0XFFF(0X前缀) 2.浮点数字字面量  double类型:.1(0.1)、3.14e2(314
 float类型:
0.1f(有后缀f)

类似于python语言的变量定义(类型推断机制,自动判断变量类型)

代码示例:
val a
=1.0e2;//double val b=1;//int var c='a';//char var d="abcd";//String var e=true;//boolean var f=.1f;//float var g=1l//long println(g.getClass())//获取字面量数据类型

3.操作符

scala中的操作符是方法

代码示例:

    var a=5; var b=3; //a+b等价于a.+(b) var result1=a+b; var result2=a.+(b); println(result1,result2);




代码示例:

      var d=1;
      var c=d=0;//变为0,c变为Unit类型(等价于java中的void),并不是将c与d变量都赋值为0
      println(c.getClass(),d)


 


 

4.控制台的读入与输出


读入
代码示例:
var a
=readInt();//读取Int类型的数据 val b=readChar(); var c=readLine(); println("a的类型:"+a.getClass(),"b的类型:"+b.getClass(),"c的类型:"+c.getClass);

 


 

输出
代码示例:
     //不在同一行的语句,“;”可以省略
        print("print:"+a)
        println("println:"+b)
        printf("printf:"+c)




字符串插值机制,在字符串字面量前加一个“s”或是“f”,其中,“s”不支持格式化,“f”支持格式化

代码示例:

          val a=3.1415926;
          val b=0.618;
          println(f"a:$a%.1f")//可以设置输出格式
          println(s"b:$b")//不可设置输出格式

5.文件的写与读


代码示例:
val writeFile
=new PrintWriter("D:\\123.txt") writeFile.print("wuhu!") writeFile.print("芜湖!") writeFile.println("giao!") writeFile.println("giao!") writeFile.close()





代码示例:

          val readFile=Source.fromFile("D:\\123.txt")
          for(line<-readFile.getLines()){
            println(line)
          }
          readFile.close()

6.for循环表达式

for(变量<-表达式){}

代码示例:

          println("单层循环:")
          for(i<-1 to 3){
            print(i+" ")
          }
          println("\n嵌套循环:")
          for(i<-1 to 3;j<-1 to 3){
            print(i+""+j)
          }
          println("\n嵌套循环:")
          for(i<-1 to 3){
            for(j<-1 to 3){
              print(i+""+j)
            }
          }//两种写法等价
          println("\n条件判断for:")
          for(i<-1 to 3;if i==1){
            print(i+" ")
          }
          println("\n遍历数组:")
          for(i<-Array(10,100,100)){
            print(i+" ")
          }
          println("\nyield关键字将for产生的所有值作为容器返回:")
          val list1=for(i<-Array(1,2,3)) yield i
          list1.foreach(print)
          print("(容器类型:"+list1.getClass()+")")

7.scala中的break与continue

scala中没有break与continue这两个关键字
只提供了Breaks来实现类似的功能,即breakable与break

代码示例:

    val a = Array(1, 2, 3, 4)
    //相当于java中的break
    println("break:")
    breakable {
      for (i <- a) {
        if (i%2==0) {
          break
        }
        println(i)
      }
    }
    //相当于java中的continue
    println("continue:")
    for(i<-a){
      breakable{
        if(i%2==0){
          break
        }
        println(i)
      }
    }

 


 

breakable:确定break的作用区域

8.数据结构

1.Array数组(可变的,可索引的,元素具有相同类型的数据集合)

代码示例:

    //显式创建数组,长度为3
    val a=new Array[Int](3)
    println("a:")
    for(i<-a)
      print(i+" ")
     println("\nb:")
     //隐式创建数组,初始值为1,2,3
    val b=Array(1,2,3)
        for(i<-b)
      print(i+" ")
      
    val c=Array.ofDim[Int](3,3)//定义3x3二维数组
    val d=Array.ofDim[Int](3,3,3)//定义3x3x3的三维数组
    println("\nc:")
    c(1)(1)=1
    print(c(1)(1))//圆括号访问数组

 


 


2.元组(tuple,多个不同类型对象的简单封装)

代码示例:

    val a=(1,"lsw",3)
    println("a:"+a)
    //显式定义,Tuple3表示该元组有三个值,Tuple4表示该元组有四个值
    val b=new Tuple3(1,"lsw",3)
    println("b:"+b)

 


3.容器(list、seq、map)

scala使用三个包来组织容器:
              scala.collection(元素可变与元素不可变容器,超类)
              scala.collection.immutable(元素不可变容器)
              scala.collection.mutable(元素可变容器)


4.序列(seq,可以按照特定顺序访问的容器)

  4.1列表(list,共享相同类型的不可变对象序列

代码示例:

    val a = List(1, 2, 3) //隐式定义
    println("列表a:"+a)
    val b: List[Int] = List(4, 5, 6) //显式定义
    println("列表b:"+b)
    val c = Nil //空列表
    val dim: List[List[Int]] =// 二维列表
      List(
        List(1, 0, 0),
        List(0, 1, 0),
        List(0, 0, 1))
    //list具有头尾概念,并且可以判断列表是否为空
    println("列表a的头部元素:" + a.head)
    println("列表a的尾部元素:" + a.tail)
    println("列表a是否为空:" + a.isEmpty)
    //列表的连接
    val d=a:::b//":::"可用于连接两个列表
    println("列表d(使用“:::”连接):"+d)
    val e=300::200::100::a//"::"只可用于在已有链表前添加元素
    println("列表e(使用“::”连接):"+e)
    val f=List.concat(a,b)//调用concat方法
    println("列表f(使用concat连接):"+f)
    val g=a:+100
    println("使用“:+”向列表a尾部添加元素:"+g)
    val h=200+:100+:a
    println("使用“+:”向列表头部添加元素:"+h)

 


 

  4.2 range(特殊的、带索引的不可变数字等差数列

1 to 3:1、2、3(左闭右闭
1 to 3 by 2:1、3步长为2
1 until 3:1、2(左闭右开

代码示例:

      val a=Range(1,5)
      println("a:"+a)

 


 

5.集合(set,不重复元素的容器)

代码示例:
      val a=Set(2,2,2,3,3,3,4,4,4)//元素不重复
      println("集合a:"+a)
      //set具有头尾概念,并且可以判断列表是否为空
      println("集合a的head:"+a.head)
      println("集合a的tail:"+a.tail)
      println("集合a是否为空:"+a.isEmpty)
      //add与remove添加与删除元素
      a.add(1)//由于a为不可变集合,所以删除后会生成一个新的set
      println("添加元素“1”后的集合a(add):"+a)
      a.remove(2)
      println("删除元素“2”后的集合a(remove):"+a)
      //+=等价于add
      a+=2
      println("添加元素“2”后的集合a(+=):"+a)
      //-=等价于remove
      a-=1
      println("删除元素“1”后的集合a(-=):"+a)

 


 

虽然可变Set和不可变Set都有添加或删除元素的操作,但是有一个非常大的差别。
不可变Set进行操作,会产生一个新的set,原来的set并没有改变,这与List一样。
对可变Set进行操作,改变的是该Set本身,与ListBuffer类似。

6.映射(map)

代码示例:
        val a=Map("1"->"a","2"->"b","3"->"c")
        println("映射a:"+a)
        //使用圆括号对map中的元素进行访问
        println("key为1的value:"+a("1"))
        println("映射a的keys:"+a.keys)
        println("映射a的keys:"+a.values)
        //查找map中是否含有key为1的映射:
        println("是否含有key为1的映射:"+a.contains("1"))
        //迭代器访问map
        val b=Iterator(a)
        println("迭代器访问映射a的结果:")
        while(b.hasNext){//hasnext用于检测是否还有下一个元素
          print(b.next+"")//next()用于遍历
        }
        print(b.next())//执行会报错,指针

 


 


7.迭代器(iterator,按顺序访问容器元素的数据结构)

代码示例:

        val b=Iterator(1,2,3,4)
        println("迭代器访问的结果:")
        while(b.hasNext){//hasnext用于检测是否还有下一个元素
          print(b.next+"")//next()用于遍历
        }
        print(b.next())//执行会报错,指针


 


 







9.scala特点(能省则省,少加精加,方法至上

1.运行于JVM上的语言
2.面向对象的语言
3.函数式语言
4.支持柯里化(将接受多个参数的函数变为接受单一参数的函数)
5.每个函数都是一个对象
6.每个值都是一个对象
7.每个操作都是方法调用

10.类(class)

1.大写字母开头
2.字段:对象包含的变量
3.方法:使用数据对对象进行可执行的程序块(def)
4.类成员的可见性:默认public(任何作用域都可以直接访问),protected(本类型与继承类)、
          private(本类型与嵌套类(内部类),外部访问通过类似java的getter与setter(value)

5.方法的参数不可用var与val来限定,因为方法的参数都是隐式的val
6.无参数的方法可省略圆括号
7.无参数的方法在定义时无括号,调用时不可添加括号;无参数的方法在定义时有括号,调用时可加可不加括号。
8.类的方法可以从方法中最后的表达式推断返回类型
9.方法允许重载
10.允许方法嵌套定义
11.构造器:整个类的定义主体
12.位于类方法外的语句都将在构造过程中执行



代码示例:

class Stu {
  private var name="lsw"//私有字段,外部不能直接访问
  var age=10//公有字段
  protected var sex=" "//受保护的字段
 
  def value():String={
    return this.name
  }//等价于def value=name,调用方法访问私有字段
 
  def printSchool(num:Int):Unit={
    println("FJUT:"+num)
  }//等价于def printSchool(num:Int)=println("FJUT:"+num)
  //当且仅有一条语句时,花括号可以省略
}

11.对象(object)

类是对象的抽象,对象是类的具体

1.scala中没有Static!!!(通过单例对象实现类似功能)
2.静态方法最大的特点就是,不用生成类的实例对象,直接可以用
3.静态方法只能调用静态成员或是方法

代码示例:

class Stu{//伴生类
  private var name="lsw"//私有字段,外部不能直接访问
  var age=10//公有字段
  protected var sex=" "//受保护的字段
 
  def value():String={
    return this.name
  }//等价于def value=name,调用方法访问私有字段
 
  def printSchool(num:Int):Unit={
    println("FJUT:"+num)
  }//等价于def printSchool(num:Int)=println("FJUT:"+num)
  //当且仅有一条语句时,花括号可以省略
  //print("success")
}
object Stu{//伴生对象
  private var height="187cm"
  def printHeight=println(s"$height")
}
//object Stu1{//孤立对象
  //private var height="187cm"
  //def printHeight=println(s"$height")

//}
11.1 单例对象(第一次被访问的时候被初始化
  使用方式:定义的类之外,还要定义一个同名的 object 对象,它和类的区别是,object对象不能带参数

  11.1.1 伴生对象(与类同名)
    
    1.伴生对象与伴生类必须位于同一个文件内
    2.相互之间可以访问私有成员
    3.伴生对象的方法只能通过伴生对象调用,不能通过伴生对象实例调用

 


 

  11.1.2 孤立对象(与类不同名)
  

 12.apply(类似于java的构造函数,自动调用)

定义:用括号传递给类示例或对象名一个或多个参数时,scala会在相应的类或对象中查找方法名为apply且参数列表与传入的参数一致的方法,
   并用传入的参数来调用该apply方法

代码示例:


 

调用:

 

运行结果:

 

 

 

13.继承(inherit)

13.1 抽象类
  1.scala抽象类无须加abstract修饰符
  2.不能被实例化


代码示例:
 
abstract class Car {
  val carBrand:String//抽象字段,未初始化
  def run()
  def stop(){
   println("我停下来了")
  }
}


13.2 类的继承
  1.单一继承
  2.重载只重载val字段
  3.子类的主构造器必须调用父类的主构造器或辅助构造器(辅助构造器的第一个表达式)
  4.不想类被继承则在定义类时加上final关键字(做绝育)
  5.重载关键字:override(重载抽象成员可省略,重载非抽象成员不可省略


代码示例:

  
abstract class Car(val name:String) {
  val carBrand:String//抽象字段,未初始化
  var age:Int=0
  def run()
  def stop(){
   println("我停下来了")
  }
  def this(name:String,age:Int){//辅助构造器,用this定义
    this(name)//调用主构造器,辅助构造器必须调用已经定义的主构造器或是辅助构造器(必须得叫爹)
    this.age=age
  }
}
//继承主构造器的派生类
class BMW (override val name:String) extends Car(name){
  override val carBrand="BMW"//override可省略
  def run(){//override可省略
    println("宝马在路上跑")
  }
  override def stop(){//override不可省略
    println("宝马停下来了")
  }
}
//继承辅助构造器的派生类
class BENZ (name:String,age:Int) extends Car(name,age){
  val carBrand="BENZ"
  def run(){
    println("奔驰在跑")
  }
  def info(){
    println("车的牌子是:"+this.carBrand+"  车龄是"+age)
  }
}


13.3类层级结构
  1.引用类型:class 数据类型(基本类型):int、double……
  

 


 


  2.scala使用null的目的:实现jvm与其他java库的兼容性,无明确需要时,能不用就不用

  

13.4 option类(抽象类

  1.包含具体的子类Some(有值)以及对象None(无值)

  2.引入目的:避免使用兼容java库带来的bug,例如return

  3.有值返回一个some对象,无值返回None

 

13.5 参数化类型

  1.引入目的:在类定义时包含一个或几个不确定的类型参数,在实例化时再进行确定

  2.方括号:“[]”

 

13.6 特质(trait关键字)

  1.使用trait关键字定义,可同时拥有抽象与非抽象方法

  2.特质的主构造器不能有参数,特质不能定义辅助构造器

  3.类使用extends或with关键字继承特质(第一个继承必须使用extends关键字,剩余使用with关键字),特质继承特质只能用with关键字

  4.

 

代码示例:

 trait Bird {//定义特质
  var canFly:String
  def flyHeight()
  def legsNum(){
    println("鸟有两条腿")
  }
}

trait Eagle extends Bird{//特质继承特质
  def flyHeight(){
    println("10000000m")
  }
}
class Chicken (name:String) extends Bird with Eagle {//类继承特质
  override var canFly="not fly"
  def flyHeight(){
    println("0m")
  }
}

 

 

 

 

 

 

 

 



 

posted @ 2021-05-10 18:27  LinSandwich  阅读(104)  评论(0)    收藏  举报