Scala

Scala

1.数据类型

scala相比较以与java语言多出来以下几种数据类型:

  • Unit:表示无返回值,与java语言中的void相同
  • Null:空值或者空引用
  • Nothing:所有其它类型的子类型,表示没有值
  • Any:所有类型的超类,任何实例都属于any类型
  • AnyRef:所有引用类型的超类
  • AnyVal:所有值的超类

在这里插入图片描述
在这里插入图片描述

2.类和对象

  • 在scala语言中一行的结尾可以省略分号,若一行中有多个语句,则需要用分号隔开

  • val 是声明常亮 var是声明变量的

  • class 属性是自带getter setter

  • class 如果有参数传进去,则是为他的默认构造器,重写构造器时,需要调用默认构造器

    class Person(xname: String, xage: Int)  {
        val name = xname
        val age = xage
        /**
          * 重写构造器,必须调用默认构造器
          */
        def this(xname: String, xage: Int, xmoney: Int) {
            this(xname, xage)
            money = xmoney
        }
    
  • class new对象时,除了方法内部不执行,其他的都执行

  • object 不能传参,object是单例,可以认为是java中的单例对象,并且它里面的方法也是静态的,

  • 在同一个scala文件中,若class与object的名字相同,则互为伴生类,伴生对象,它们可以直接访问对方的所有变量


class Person(xname:String,xage:Int){
  val name =xname;
  val age = xage;
  private var money=100;

  }
  def test(): Unit ={
    println(Person.test)
  }
}

object Person {
  private var test = "wuming"
  //public static void main (String[] args)
  def main(args: Array[String]): Unit = {
    val  person: Person =new Person("zs",18,1000)
    println(person.name+":"+person.age+":"+person.money)
  }
}

3.循环

  • to 和 until的用法
object Loop {
  def main(args: Array[String]): Unit = {
    //1 to 10 返回1到10的Range数组,包含10
    println(1 to 10)
    //1 to 10 返回1到10的Range数组,不包含10
    println(1 until 10)
  }
 }
  • for 循环
object Loop {
  def main(args: Array[String]): Unit = {
	for (i <- 1 to 10){
    println(i)
  }
 /**
  *可以在for循环中加入条件判断
  */
  for (i <- 1 to 10;if i>5;if i%2==0){
    println(i)
  }
 }
  • scala中不能使用count++,count–只能使用count = count+1 ,count += 1

4.Scala函数

  • 在scala语法中,return是可以省略掉,scala自动将函数的最好一行的值,作为返回值,{}在只有一行语句时也可以省略
object Function {
  def main(args: Array[String]): Unit = {
    def max(a:Int,b:Int)={
      if (a>b)
        a
      else
        b
    }
    val result=max(1,2)
    println(result)
  }
}
  • 函数可以省略返回类型,会自动推动,但是当显示的调用return时,不可以省略返回类型

  • 如果省略掉 = ,则函数会自动将返回值丢弃,所有我们可以在不需要返回值的函数上,省略=

  • 函数里面的参数都是val,所以在函数中不可以修改参数值

  • 递归函数,不可以省略返回类型
object Function {
  def main(args: Array[String]): Unit = {
  def f1(number:Int): Int ={
    if (number==1)
      return 1
    number*f1(number-1)
  }
  println(f1(3))
  • 包含默认值参数的函数
package com.shsxt
object Function {
  def main(args: Array[String]): Unit = {

  /**
    * 包含默认值参数的函数
    */
  def f2(a: Int = 4, b: Int = 5): Int = {
    a + b
  }
  println(f2(b = 6))
}

  • 可变参数函数,java中int…
package com.shsxt


object Function {
  def main(args: Array[String]): Unit = {
  /**
    * 可变参数函数
    */
  def sum(a:Int*) ={
    var sum =0
    for(i <- a){
      sum += i
    }
    sum
  }
  println(sum(1,2,3,4,5))
}

  • 匿名内部类
package com.shsxt


object Function {
  def main(args: Array[String]): Unit = {
  /**
    * 匿名函数
    */
  var f4 = (a:Int,b:Int) => {
    println(a+b)
  }
  f4(1,10)
  val f5 =()=>{
    println("无参匿名函数...")
  }
  f5()
}

  • 嵌套函数
package com.shsxt


object Function {
  /**
    * 嵌套函数
    */
  def f6(a: Int, b: Int) = {
    def f7(c: Int) = {
      (a + b) * c
    }

    println(f7(10))
  }

  f6(1, 2)
}

  • 偏应用函数,变化的自有一个参数
package com.shsxt

import java.util.Date
object Function {
  def main(args: Array[String]): Unit = {
  /**
    * 偏应用函数
    */
  def log(date: Date, log: String) = {
    println("date is " + date + ",log is " + log)
  }
  val date = new Date()
  //想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
  val logWithDate = log(date, _: String)
  logWithDate("log11")
  logWithDate("log12")
  logWithDate("log13")

  • 高阶函数: 函数的参数是函数,或函数的返回类型是函数,或函数的参数和函数的返回类型都是函数的函数
      def f7(a: Int, f: (Int, Int) => Int) = {
         val result = f(1, 2)
         println(   "result : " + result)
         println(a * result)
        }
       def sum(a: Int, b: Int):Int = {a + b}
        f7(5,sum)
       f7(5,(a:Int,b:Int)=>{a + b})
        def f8(a:Int,b:Int):(String,String)=>String = {
            def f9(c:String,d:String):String={
                a + "!" + b + "!" + c + "!" + d
            }
            f9
        }
        // alt + enter
   		 val f9: (String, String) => String = f8(1,2)
    	val result = f9("3","4")
    	println(result)
    	val result = f8(6,7)("8","9")
    	println(result)
  • 柯里化函数:可以理解为高阶函数的简化
package com.shsxt

import java.util.Date
object Function {
  def main(args: Array[String]): Unit = {
/**
 * 柯里化函数
 */
def fun7(a :Int,b:Int)(c:Int,d:Int) = {
   a+b+c+d
  }
 println(fun7(1,2)(3,4))
}

5.Scala字符串

package com.shsxt

/**
  * Created by Administrator on 2019/12/23.
  */
object String {
  def main(args: Array[String]): Unit = {
    val str = "abcd"
    println(str.indexOf(98))
    println(str.indexOf("b"))

    val str1 = "ABCD"
    //比较地址
    println(str==str1)
    /**
      * compareToIgnoreCase
      * 不区分大小写
      * 如果参数字符串等于此字符串,则返回值 0;
      * 如果此字符串小于字符串参数,则返回一个小于 0 的值;
      * 如果此字符串大于字符串参数,则返回一个大于 0 的值。
      *
      */
    println(str.compareToIgnoreCase(str1))
    /**
      * 字符串连接使用StringBuilder
      */
    var stringBuilder = new StringBuilder
    stringBuilder.append("abc")
    stringBuilder.+('d')
    stringBuilder+'e'
    stringBuilder.++("fg")
    stringBuilder++="hi"
    stringBuilder.+=('j')
    stringBuilder+='k'
    println(stringBuilder)
  }
}

6.数组

  • 创建,遍历,合并
package com.shsxt

/**
  * 可变集合,不可变集合
  */
object Sxt_Array {
  def main(args: Array[String]): Unit = {
    //创建数组
    val array =Array(1,2,3)
    //遍历
    for (i<- array){
      println(i)
    }
    array.foreach(x=>{println(x)})
    array.foreach(println(_))
    array.foreach(println)
    //创建数组
    val array1 =new Array[Int](3)
    array1(0)=1
    array1(1)=2
    array1(2)=3
    array1.foreach(println)

    println("=====创建二维数组======")
    //创建二维数组
    val array2=new Array[Array[Int]](3)
    array2(0)=Array(1,2)
    array2(1)=Array(3,4)
    array2(2)=Array(5,6)
    array2.foreach(x=>{
      x.foreach(println)
    })

    println("=====合并数组=======")
    //合并数组
    var arr1 = Array("1","2","3")
    var arr2 = Array("3","4","5")
    val array3=Array.concat(arr1,arr2)
    array3.foreach(println)

    println("======创建初始值的定长数组=======")
    //创建初始值的定长数组
    val arr = Array.fill(5)("shsxt")
    arr.foreach(println)
  }
}

在这里插入图片描述

  • 可变长数组
val arr = ArrayBuffer[String]("a","b","c")
arr.append("hello","scala")//添加多个元素
arr.+=("end")//在最后追加元素
arr.+=:("start")//在开头添加元素
arr.foreach(println)

7.list

  • 创建,遍历
package com.shsxt

/**
  * Created by Administrator on 2019/12/24.
  */
object Sxt_list {
  def main(args: Array[String]): Unit = {
    //创建
    var list =List(1,2,3)
    //遍历
    for (i<-list){
      println(i)
    }
    list.foreach(println)

    println("======常用方法=========")
    //filter  过滤
    val result: List[Int] =list.filter(x=>{
      if(x>2)
        true
      else
        false
    })
    result.foreach(println)

    //计算符合条件的元素个数
    val  count: Int =list.count(x=>{
      if(x>2)
        true
      else
        false
    })
    println(count)

    //操作集合里面的元素
    val result1: List[Int] =list.map(x=>{
      x*2
    })
    result1.foreach(println)

    val array = List("hello shsxt","hello bjsxt","hello gzsxt")
    val mapResult: List[Array[String]] =array.map(x=>{
      x.split(" ")
    })
    mapResult.foreach(println)

  println("======flatmap :压扁扁平,先map再flat========")
    val result2: List[String] = array.flatMap(x=>x.split(" "))
    result2.foreach(println)
  }
}

  • 可变长数组
val listBuffer = ListBuffer(1,2,3)
   listBuffer.append(3,4,5)
   listBuffer.foreach(println)
val listBuffer: ListBuffer[Int] = ListBuffer[Int](1,2,3,4,5)
listBuffer.append(6,7,8,9)//追加元素
listBuffer.+=(10)//在后面追加元素
listBuffer.+=:(100)//在开头加入元素
listBuffer.foreach(println)

8.set

  • 创建,遍历,常用方法
package com.shsxt

/**
  * set
  */
object Sxt_set {
  def main(args: Array[String]): Unit = {
    //set自动去重
    val set1: Set[Int] = Set(1,2,2,3)
    set1.foreach(println)
    //最大
    println(set1.max)
    //最小
    println(set1.min)
    val set2 = Set(1,4,5)
    //转成字符串
    val str = set2.mkString("!")
    println(str)
    println("====并集====")
    val set = set1.union(set2)
    set.foreach(println)
    println("===差集====")
    val set3 = set2.diff(set1)
    set3.foreach(println)
    println("===交集====")
    val set4 = set1.intersect(set2)
    set4.foreach(println)
  }
}

  • 可变长度set(需手动导包)
import scala.collection.mutable.Set
val set = Set[Int](1,2,3,4,5)
set.add(100)
set.+=(200)
set.+=(1,210,300)
set.foreach(println)

9.Map

  • 创建,遍历,合并map
package com.shsxt

/**
  * Created by Administrator on 2019/12/24.
  */
object Sxt_map {
  def main(args: Array[String]): Unit = {
    //创建map
    val map: Map[String, Any] = Map("name" -> "zs", "age" -> "18", ("money", 100))
    //全遍历
    map.foreach(x => println(x._1 + " " + x._2))
    //不确认map是否存在
    val option = map.get("name")
    println(option.get)
    //如果没有指定map的值,就赋值传入的值
    val result = map.getOrElse("lala", 100)
    println(result)
    println("==========================")
    //遍历key
    val keyIterable = map.keys
    keyIterable.foreach(key => {
      println(key + " " + map.get(key).get)
    })
    println("==========================")
    //遍历value
    val valueIterable = map.values
    valueIterable.foreach(value => {
      println(value)
    })
    println("==================")
    //合并map 合并map会将map中的相同key的value替换
    val map1 = Map((1, "a"), (2, "b"), (3, "c"))
    val map2 = Map((1, "aa"), (2, "bb"), (2, 90), (4, 22), (4, "dd"))
    map1.++(map2).foreach(x=>{
      println(x._1+" "+x._2)
    })
  }
}

  • map的常见方法
    /**
     * map方法
     */
    //count统计符合条件的记录数
    val countResult  = map.count(p => {
      p._2.equals("shsxt")
    })
    println(countResult)
    
    //filter过滤,留下符合条件的记录
    map.filter(_._2.equals("shsxt")).foreach(println)
    
    //contains map中是否包含某个key
    println(map.contains(2))
   
    //exist 符合条件的记录存在不存在
    println(map.exists(f =>{
      f._2.equals("xasxt")     
    }
    
  • 可变长读map(需手动导包)
import scala.collection.mutable.Map
val map = Map[String,Int]()
map.put("hello",100)
map.put("world",200)
map.foreach(println) 	

10.元组

与列表一样,与列表不同的是元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的

  • 创建元组与取值

    package com.shsxt
    
    object Sxt_tuple {
      def main(args: Array[String]): Unit = {
        //创建,最多支持22个
        val tuple = new Tuple1(1)
        val tuple2 = Tuple2("zhangsan",2)
        val tuple3 = Tuple3(1,2,3)
        val tuple4 = (1,2,3,4)
        val tuple18 = Tuple18(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
        val tuple22 = new Tuple22(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)
        //使用
        println(tuple2._1 + "\t"+tuple2._2)
        val t = Tuple2((1,2),("zhangsan","lisi"))
        println(t._1._2)
          
        //创建和取值
        val tuple2: (String, Int) = Tuple2("zhangsan",2)
        println(tuple2._1 + "\t"+tuple2._2)
        val t = Tuple2((1,2),("zhangsan","lisi"))
        println(t._1._2)
    
        //遍历
        val tuple4 = (1,2,3,4)
        val tupleIterator=tuple4.productIterator
        while(tupleIterator.hasNext){
          println(tupleIterator.next())
        }
        //swap方法,元素翻转(只针对二元组)
        val swap=tuple2.swap
        println(swap)
      }
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值