Scala基础部分知识点

Scala

scala基础

数据类型

在这里插入图片描述

易混淆:

在这里插入图片描述

变量和常量的声明

package scala.basic

/**
  * scala:
  * 1. scala object 相当于java中的单例,object中定义的全是静态的(相当与java的工具类)
  * 2. scala 中定义变量使用var,定义常量使用val,变量可变,常量不可变
  * 3. scala 中每行后面会有分号自动推断机制,可以不写“;”
  * 4. 建议Scala中命名使用驼峰命名法
  */

object objectClass {
  def main(args: Array[String]): Unit = {
    val a = 100;
    var b = 200
    b = 300
    println(a)
    println(b)
    
  }

}

类和对象

package scala.basic

/**
  * scala:
  * 5. Scala类中可以传参,传参一定要指定类型,有了参实就有了默认构造
  * 6. 类中属性默认有getter和setter方法
  * 7. 类中重写构造,构造中第一行必须先调用默认构造。def this(。。){。。}
  * 8. Scala当new class 时,类中除了方法不执行【除构造】,其他都执行。在类中可直接写语句
  * 9. 在同一个scala文件中,class名称和Object名称一样时,这个类叫做这个对象的伴生类,这个对象叫做这个类的半生对象,它们可以互相访问私有变量
  * 10. 对象不能传参,要传参,使用apply方法
  */

//类
class Person(name:String,age:Int){
  val xname = name
  var xage = age

  var gender = 'M'

  //重写构造
  def this(yname:String,yage:Int,ygender:Char){
    //必须调用默认构造
    this(yname,yage)
    this.gender = ygender
  }

  //方法
  def sayName():Unit = {
    println("hello " + xname)
  }
}

//对象
object objectClass {
  def main(args: Array[String]): Unit = {

    val p = new Person("lisi",20)
    println(p.xname)
    println(p.xage)
    p.xage = 40
    println(p.xage)

  }

}

简单语法

  1. if 语句与java没有区别

  2. for循环

    for(i <- 1 to 10){println(i)}
    
    1. 1 to 10 :左闭右闭

    2. 1 until 10 :左闭右开

    3. 九九乘法表

      package scala.basic
      
      object basic {
        def main(args: Array[String]): Unit = {
          for (i <- 1 to 9) {
            for (j <- 1 to i) {
              print(j + "*" + i + "=" + i * j + "\t")
                //print(s"$i * $j = " + i*j)
            }
            println()
          }
        }
      }
      //方法二
      for (i <- 1 to 9;j <- 1 to i) {
            print(j + "*" + i + "=" + i * j + "\t")
            if(i==j) println()
          }
      
      
  3. while与do…while

    与java相同

方法与函数

方法的定义

  1. 语法:

    def max//名称(x:Int,y:Int//参数):Int//返回值 = {
    //方法体
    }
    
package scala.basic

object fangfa {
  def main(args: Array[String]): Unit = {

    /**
      * 方法定义
      *  1. 方法体的返回值可以省略,没有return时可省略,默认将方法体中最后一行作为返回结果
      *  2. 方法体最后可以使用return,如果使用了return,那么方法体的返回类型一定要指定
      *  3. 定义的方法传入的参数一定要指定类型
      *  4. 方法的方法体如果可以一行写完那方法体的括号可以省略
      *  5. 如果定义方法省略了方法名称和方法体间的“=”,那么无论方法体最后一行计算的结果都会被丢弃,返回Unit
      *
      * @param a
      * @param b
      * @return
      */
    def max(a: Int, b: Int): Int = {
      if (a > b) {
        a
      } else {
        b
      }
      //方法二
      //if(a > b) a else b
    }

    println(max(100,2))
  }
}

其余函数

package scala.basic

import java.util.Date

object 方法2 {
  def main(args: Array[String]): Unit = {

    /**
      * 递归方法要显式的显示返回类型
      * @param num
      * @return
      */
    def fun(num:Int): Int ={
      if(num == 1){
        1
      }else{
        num*fun(num-1)
      }
    }

    println(fun(5))

    /**
      * 参数有默认值的方法
      */
    def fun1(a:Int=10,b:Int=20): Int ={
      a+b
    }


    /**
      * 可变长参数的方法
      * 多个参数只能传同种类型的
      */
    def fun2(s:String*): Unit ={
      s.foreach(println)
    }
    fun2("a","b","c")

    /**
      * 匿名函数
      * (a:Int,b:Int) => {a+b}
      */
    val function: (Int, Int) => Int = (a:Int,b:Int) => {a+b}
    println(function(10, 20))


    /**
      * 嵌套方法
      */
      def fun3(num:Int): Int ={
        def fun4(a:Int):Int={
          if(a == 1){
            1
          }else{
            a*fun(a-1)
          }
        }
        fun4(num)
      }

      println(fun3(5))

    /**
      * 偏应用函数
      * 某些情况下,方法中参数非常多,每次调用只有固定的某个参数变化其他的都不变,可以定义偏应用函数
      */
      def showlog(date:Date,log:String): Unit ={
        println("date is " + date + "log is " + log)
      }
      val date = new Date()
      showlog(date,"a")
      showlog(date,"b")
      showlog(date,"c")

      def fun6 = showlog(date,_:String)
      fun6("aaa")

    /**
      * 高级函数
      * 1. 方法的参数是函数
      * 2. 方法的返回是函数
      * 3. 方法的参数和返回都是函数
      */

    //参数是函数
      def fun7(f:(Int,Int)=>Int,s:String): Int ={
        val i: Int = f(100,200)
        i
      }

      def f(a:Int,b:Int) ={
        a+b
      }

      println(fun7(f, "aa"))
    println(fun7((a: Int, b: Int) => {
      a * b
    }, "aaaa"))

    //返回值是函数
    def fun8(s:String):(String,String)=>String = {
      def fun9(s1:String,s2:String):String={
        s1+"\t"+s2+"\t"+s
      }
      fun9
    }

    println(fun8("aaa")("a","b"))


    /**
      * 柯里化函数
      */
    def fun10(a:Int,b:Int)(c:Int,d:Int): Int ={
      a+b+c+d
    }

    println(fun10(1, 2)(3, 4))
  }
}

字符串和集合

字符串

  1. 与java相似

集合

Array
package scala.basic

import scala.collection.mutable.ArrayBuffer

object Array_demo {
  def main(args: Array[String]): Unit = {
    //默认不可变
    //创建
    val array: Array[String] = Array[String]("a","b","c")

    val array2 = new Array[Int](5)//()中参数为Array长度,存在默认初始值
    array2.foreach(println)
    println("*******************")
    //赋值
    array2(0) = 10
    array2(3) = 20
    array2.foreach(println)
    println("*******************")
    //二维数组
    val array3 = new Array[Array[Int]](3)
    array3(0) = Array[Int](1,2,3)
    array3(1) = Array[Int](1,2,3)
    array3(2) = Array[Int](1,2,3)
    for (i <- array3){
      for (j <- i){
        println(j)
      }
    }
    //遍历
    println("*******************")
    array.foreach(println)
    for(i <- array){
      println(i)
    }

    //方法
    //两个数组合并
    val concat = Array.concat(array,array)
    //初始化一个长度为5值为hello的数组
    val fill = Array.fill(5)("HEllo")


    //可变数组
    val ab = new ArrayBuffer[Int](3)
    ab.+=(10)
    ab.+=:(100)
    ab.foreach(println)
  }
}

List
package scala.basic

import scala.collection.mutable.ListBuffer

object List_Deom {
  def main(args: Array[String]): Unit = {
    //创建
    val ints: List[Int] = List(1,2,3)

    //遍历
    ints.foreach(println)
    for (i <- ints){
      println(i)
    }

    //过滤
    val intsfilter = ints.filter(s => {
      s == 1
    })
    intsfilter.foreach(println)

    //返回符合条件的数据条数
    val i = ints.count(_ >= 2)
    println(i)

    //可变list
    val buffer = ListBuffer[Int](1,2,3)
    buffer.foreach(println)
    //追加元素
    buffer.append(4,5,6)

  }
}

Set
package scala.basic

object Set_Deom {
  def main(args: Array[String]): Unit = {
    //创建
    val set1 = Set[Int](1,2,2,3,4,5,5,6)
    //遍历
    set1.foreach(println)

    //方法
    //交集
    val set2 = Set[Int](2,3)
    val result = set1.intersect(set2)
    println(result)
    //差集
    val result2 = set1.diff(set2)
    println(result2)
    //操作符操作
    //交集
    val result3 = set1 & set2
    println(result3)
    //差集
    val result4 = set1 &~ set2
    println(result4)
    //filter
    val set3 = set1.filter(_ > 2)
    set3.foreach(println)

    //可变set
    import scala.collection.mutable.Set
    val set5 = Set[Int](1,2,3)
    set5.+=(100)


  }
}

Map
package scala.basic

object Map_Deom {
  def main(args: Array[String]): Unit = {
    //创建
    val map = Map[Int,Int](1 -> 10,2 -> 20,(3,30),(3,40))
    //相同的Key后面的会覆盖前面的
    //遍历
    for (i <- map){
      println(i)
    }

    map.foreach(println)

    //按键取值
    val maybeInt: Int = map.get(1).get
    println(maybeInt)
    //当KEY的值可能不存在时
    val result = map.get(1).getOrElse("null")
    println(result)

    //获取所有的KEY
    val keys = map.keys
    keys.foreach(key=>{
      println(map.get(key).get)
    })

    //遍历所有的VALUE值
    val values = map.values
    values.foreach(println)

    //map合并,合并时后面的KEY的值覆盖前面的
    val map1 = Map[String,Int](("a",1),("b",2),("c",3))
    val map2 = Map[String,Int](("a",4),("e",5),("d",6))
    val inmap = map1.++(map2)
    inmap.foreach(println)

    //可变MAP
    import scala.collection.mutable.Map
    val map3 = Map[Int,Int]((1,1))
    map3.put(2,3)
    //filter
    val filmap = map3.filter(x => {
      x._1 == 1
    })
    filmap.foreach(println)
  }

}

Tuple
package scala.basic

object Tuple_demo {
  def main(args: Array[String]): Unit = {
    //创建
    val tuple1 = new Tuple1("hello")
    val tuple2: (Int, Int) = new Tuple2(1,20)
    val tuple3 = Tuple3(1,2,3)
    val tuple4 = (1,2,3,4)
    //Tuple最多22个元素
    //元组使用 ._x 取值 x 表示第几个元素,下标从1开始
    //遍历
    val iterator = tuple4.productIterator
    iterator.foreach(println)
    
    //Tuple2 有 swap反转方法
  }
}

Traitl

package scala.basic

trait Read {
  def read(name:String): Unit = {
    println(name)
  }
}

trait Listen {
  def listen(name:String): Unit = {
    println(name)
  }
}

/**
  * trait可以有方法的实现也可以有方法的不实现
  */
trait equal{
  def isequal(o:Any):Boolean
  def isnoeq(o:Any):Boolean = !isequal()
}

class Point(x:Int,y:Int) extends equal {
  val xx = x
  val yy = y

  override def isequal(o: Any): Boolean = {
    o.isInstanceOf[Point]&&o.asInstanceOf[Point].xx == this.xx
  }
}

//继承多个trait 第一个用 extends 后面的使用 with
class Person1() extends Read with Listen {

}

object Traitl_Demo {
  def main(args: Array[String]): Unit = {
    val person = new Person1()
    person.read("zhangsan")
    person.listen("lisi")
  }
}

模式匹配|偏函数

package scala.basic

object model_demo {
  def main(args: Array[String]): Unit = {
    val tuple = (1,1.1,"abc",true,"a")
    val iterator = tuple.productIterator
    iterator.foreach(MatchTest(_))
    //模式匹配可以匹配值还可以匹配类型
    //匹配过程中存在数值的转换
    //从上往下匹配,匹配上后会自动停止
    def MatchTest(o:Any)={
      o match {
        case 1 => println("num is " + 1)
        case i:Int => println("num "+i)
        case s:String => println("String:"+ s )
        case _ => println("no") // 默认匹配什么都匹配不上,放在最后
      }
    }

    //偏函数
    //[匹配值类型,返回值类型]
    def myTest:PartialFunction[String,Int]={
      case "abc" => 2
      case "a" => 200
      case _ => 404
    }
    val i = myTest("a")
    println(i)
  }
}

样例类

package scala.basic

//使用case关键字修饰的类就是样例类
case class p(name:String,age:Int){
  //参数默认有getter和setter方法
  //实现了toString,equals,copy和hashCode方法
}

object case_demo {
  def main(args: Array[String]): Unit = {

    val p1 = new p("zhangsan",10)
    val p2 = new p("zhangsan",10)
    println(p1.equals(p2))
    
  }
}

字符串操作

  1. charAt(int index):返回指定位置的字符
  2. concat(String str):将指定字符串连接到此字符串的结尾

日期

val nowdate = LocalDate.now()
    println("LocalDate.now()-->现在的时间是"+LocalDate.now())
    println("nowdate.plusDays-->明天是-->"+nowdate.plusDays(1))
    println("nowdate.minusDays-->昨天是-->"+nowdate.minusDays(1))
    println("nowdate.plusMonths-->今天加一个月-->"+nowdate.plusMonths(1))
    println("nowdate.minusMonths-->今天减一个月-->"+nowdate.minusMonths(1))
    println("nowdate.getDayOfYear-->今天是今年的第"+nowdate.getDayOfYear+"天")
    println("nowdate.getDayOfMonth->这个月有"+nowdate.getDayOfMonth+"天")
    println("nowdate.getDayOfWeek-->今天星期"+nowdate.getDayOfWeek)
    println("nowdate.getMonth-->这个月是"+nowdate.getMonth)

object Test_Time001 {
  def main(args: Array[String]): Unit = {
//    获取今天日期
    def getNowDate():String={
      var now:Date = new Date()
      var  dateFormat = FastDateFormat.getInstance("yyyy-MM-dd")
      var today = dateFormat.format( now )
      today
    }
 
//    获取昨天的时间
    def getYesterday():String= {
      var dateFormat = FastDateFormat.getInstance("yyyy-MM-dd")
      var cal = Calendar.getInstance()
      cal.add(Calendar.DATE, -1)
      var yesterday = dateFormat.format(cal.getTime())
      yesterday
    }
 
//    获取本周开始日期
    def getNowWeekStart():String={
      var day:String=""
      var cal:Calendar =Calendar.getInstance();
      var df =  FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
      //获取本周一的日期
      day=df.format(cal.getTime())
      day
    }
 
//    获取本周末日期
    def getNowWeekEnd():String={
      var day:String=""
      var cal:Calendar =Calendar.getInstance();
      var df = FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//这种输出的是上个星期周日的日期,因为老外把周日当成第一天
      cal.add(Calendar.WEEK_OF_YEAR, 1)// 增加一个星期,才是我们中国人的本周日的日期
      day=df.format(cal.getTime())
      day
    }
 
//    本月的第一天
    def getNowMonthStart():String= {
      var day: String = ""
      var cal: Calendar = Calendar.getInstance();
      var df = FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DATE, 1)
      day = df.format(cal.getTime()) //本月第一天
      day
    }
 
//    本月最后一天
    def getNowMonthEnd():String={
      var day:String=""
      var cal:Calendar =Calendar.getInstance();
      var df = FastDateFormat.getInstance("yyyy-MM-dd");
      cal.set(Calendar.DATE, 1)
      cal.roll(Calendar.DATE,-1)
      day=df.format(cal.getTime())//本月最后一天
      day
    }
 
//    将时间戳转化成日期/时间
    def DateFormat(time:String):String={
      var sdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
      var date:String = sdf.format(new Date((time.toLong)))
      date
    }
 
//    计算时间差
    def getCoreTime(start_time:String,end_Time:String)={
      var df = FastDateFormat.getInstance("HH:mm:ss")
      val begin = start_time
      val end = end_Time
      var between = (end.toLong - begin.toLong)/1000  //转化成秒
      var minute = between % 60 //转化为分钟
      val hour = between % (60*60) //转化为小时

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值