scala

一.scala基础

1.数据基础

2.变量和常量的声明

  • var 定义的是变量可以修改val  定义的是常量不可以修改
  • package com.shsxt.scala?/**  * @author: Savage  * @data: 2019/10/21 19:50  */object Text {?  class Person{    var name = "zhangsan"    var age = 18?    def sayName={      "this name is" + name    }  }?  def main(args: Array[String]): Unit = {    val person = new Person()    println(person.name)    println(person.age)    println(person.sayName)  }?}
    • 创建对象可以通过new对象获取其中的属性的方法

  • package com.shsxt.scala/**  * @author: Savage  * @data: 2019/10/21 19:55  */class CompanionObject(xname: String, xage: Int) {  var name = CompanionObject.name  val age = xage  var gender = "m"?  def this(name: String, age: Int, g: String) {    this(name, age)    gender = g  }?  def sayName() = {    "my name is " + name  }?}?object CompanionObject {    private val name = "zhangsanfeng"   // val age=19?    def main(args: Array[String]): Unit = {      val person = new CompanionObject("wagnwu", 10, "f")      println(person.age);      println(person.sayName())      println(person.gender)    }  }
    • 伴生类和伴生对象可以互相访问其中的私有的属性.区别伴生类和伴生对象的方法时两个类的名字一样

  • scala语言的注意点:

    • 建议类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法

    • scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。object不可以传参数

    • scala中的class类默认可以传参数,默认的传参数就是默认的构造函数.重写构造函数的时候,必须要调用默认的构造函数。

    • l class 类属性自带getter ,setter方法。

    • 使用object时,不用new,使用class时要new ,并且new的时候,class中除了方法不执行,其他都执行

    • 如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。

3.一些常用的类

  • if

    • val age = 18if (age < 18) {  println("no allow")} else if (18 <= age && age <= 20) {  println("allow with other")} else {  println("allow self")}
  • to和until 的用法

    • println(1 to 10)    //Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)println(1 until 10) //Range(1, 2, 3, 4, 5, 6, 7, 8, 9, )
    • to 包含最后一个元素;until不包含最后一个元素

  • for循环

    • object Loop {  def main(args: Array[String]): Unit = {    for (i <- 1 to 10)      println(i)?  }}
    • package com.shsxt.scala?/**  * @author: Savage  * @data: 2019/10/21 20:14  */object Loop {  def main(args: Array[String]): Unit = {        for(i <- 1 until 10 ;j <- 1 until 10){          if(i>=j){            print(i +" * " + j + " = "+ i*j+"  ")          }          if(i==j){            println()           }        }?  }}
    • for循环中加判断条件

    • object Loop {  def main(args: Array[String]): Unit = {        for(i <- 1 until 10 ;if(i%2==0&&i>5)) {          println(i)        }  }}
    • scala中不能使用count++,count—只能使用count = count+1 ,count += 1

    • for循环用yield 关键字返回一个集合

二.scala函数

  • 函数定义

    • object TestFunction {?  def main(args: Array[String]): Unit = {    println(fun1(1,2))    def fun1(a:Int,b:Int)={      a+b    }  }}
  • 注意点:

    • 函数定义语法 用def来定义

    • 可以定义传入的参数,以及指定传入参数的类型

    • 方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数中或者函数的返回值是函数类型的时候

    • l scala中函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数的返回类型。

    • 如果返回值可以一行搞定,可以将{}省略不写

    • 传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。

    • l 如果去掉方法体前面的等号,那么这个方法返回类型必定是Unit的。这种说法无论方法体里面什么逻辑都成立,scala可以把任意类型转换为Unit.假设,里面的逻辑最后返回了一个string,那么这个返回值会被转换成Unit,并且值会被丢弃。

  • 递归函数

    • println(fun2(5))def fun2(a:Int):Int={  if(a==1)    a  else    a*fun2(a-1)}
  • 包含参数默认值的函数

    • def fun3(a :Int = 10,b:Int) = {   println(a+b) }   fun3(b=2)}
    • l 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。

    • 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。

  • 可变参数个数的函数

    • //多个参数用逗号分开def fun4(elements :Int*)={  var sum = 0;  for(elem <- elements){    sum += elem  }  sum}    println(fun4(1,2,3,4))   }
  • 匿名函数

    • //有参数匿名函数val value1 = (a : Int) => {  println(a)}value1(1)//无参数匿名函数val value2 = ()=>{  println("我爱尚学堂")}value2()//有返回值的匿名函数val value3 = (a:Int,b:Int) =>{  a+b}println(value3(4,4))
  • 嵌套函数

    • def fun5(num:Int)={  def fun6(a:Int,b:Int):Int={    if(a == 1){      b    }else{      fun6(a-1,a*b)    }  }  fun6(num,1)}    println(fun5(5))
  • 偏应用函数

    • def log(date :Date, s :String)= {  println("date is "+ date +",log is "+ s)}?    val date = new Date()    log(date ,"log1")    log(date ,"log2")    log(date ,"log3")?    //想要调用log,以上变化的是第二个参数,可以用偏应用函数处理    val logWithDate = log(date,_:String)    logWithDate("log11")    logWithDate("log22")    logWithDate("log33")
  • 高阶函数

    • //函数的参数是函数def hightFun(f : (Int,Int) =>Int, a:Int ) : Int = {  //这里的100和a是函数f v1和v2的值,所以写的顺序无关,最后只要a这个变量对应上传进来的值即可    f(a,100)}    def f(v1 :Int,v2: Int):Int  = {      v1+v2    }?    println(hightFun(f, 1))
    • //函数的返回是函数def hightFun2(a : Int,b:Int) : (Int,Int)=>Int = {  def f2 (v1: Int,v2:Int) :Int = {    v1+v2+a+b  }  f2}    println(hightFun2(1,2)(3,4))
    • //函数的参数是函数,函数的返回是函数def hightFun3(f : (Int ,Int) => Int) : (Int,Int) => Int = {  f}    println(hightFun3(f)(100,200))    println(hightFun3((a,b) =>{a+b})(200,200))    //以上这句话还可以写成这样    //如果函数的参数在方法体中只使用了一次 那么可以写成_表示    println(hightFun3(_+_)(200,200))
  • 柯里化函数

    • def fun7(a :Int,b:Int)(c:Int,d:Int) = {  a+b+c+d}    println(fun7(1,2)(3,4))

三.字符串

  • String 定长

    • String 方法    char charAt(int index)//返回指定位置的字符  从0开始    int compareTo(Object o)//比较字符串与对象    int compareTo(String anotherString)//按字典顺序比较两个字符串    int compareToIgnoreCase(String str)//按字典顺序比较两个字符串,不考虑大小写    String concat(String str)//将指定字符串连接到此字符串的结尾    boolean contentEquals(StringBuffer sb)//将此字符串与指定的 StringBuffer 比较。    static String copyValueOf(char[] data)//返回指定数组中表示该字符序列的 String    static String copyValueOf(char[] data, int offset, int count)//返回指定数组中表示该字符序列的 String    boolean endsWith(String suffix)//测试此字符串是否以指定的后缀结束    boolean equals(Object anObject)//将此字符串与指定的对象比较    boolean equalsIgnoreCase(String anotherString)//将此 String 与另一个 String 比较,不考虑大小写    byte getBytes()//使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中    byte[] getBytes(String charsetName//使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中    void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)//将字符从此字符串复制到目标字符数组    int hashCode()//返回此字符串的哈希码16  int indexOf(int ch)//返回指定字符在此字符串中第一次出现处的索引(输入的是ascii码值)    int indexOf(int ch, int fromIndex)//返返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索    int indexOf(String str)//返回指定子字符串在此字符串中第一次出现处的索引    int indexOf(String str, int fromIndex)//返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始    String intern()//返回字符串对象的规范化表示形式    int lastIndexOf(int ch)//返回指定字符在此字符串中最后一次出现处的索引    int lastIndexOf(int ch, int fromIndex)//返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索    int lastIndexOf(String str)//返回指定子字符串在此字符串中最右边出现处的索引    int lastIndexOf(String str, int fromIndex)//返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索    int length()//返回此字符串的长度    boolean