scala(四)

1.字符串插值(推荐)

  • 用于字符串拼接 println(s"Hello $name")
  • 多行字符串
object StringApp {

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

    val greeting = "Hello...."
    println(greeting)

    val name = "数据"
    val welcome = "Hello:" + name
    println(welcome)

    // String interpolation 字符串插值(推荐)
    println(s"Hello:$name")

    val msg =
      """
        |这是一个多行字符串
        |hello
        |数据
      """.stripMargin
    println(msg)

  }
}

输出结果:

Hello....
Hello:数据
Hello:数据

这是一个多行字符串
hello
数据

源码 SparkContext

2.List

定长List
  • list不可变 可变 有序可重复
scala> val l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)

scala> l.head
res2: Int = 1

scala> l.tail
res3: List[Int] = List(2, 3, 4, 5)
  • 不允许用list来定义一个list
    把1和Nil拼接起来
    :: 是list中的方法,不是int的方法
scala> val l2= 1 :: Nil
l2: List[Int] = List(1)


scala> val l3= 2 :: l2
l3: List[Int] = List(2, 1)


scala> val l4 = 1 :: 2 :: 3 :: Nil
l4: List[Int] = List(1, 2, 3)
变长List
scala> val l5=scala.collection.mutable.ListBuffer[Int]()
l5: scala.collection.mutable.ListBuffer[Int] = ListBuffer()

scala> l5 += 2
res4: l5.type = ListBuffer(2)

scala> l5 += (3,4,5)
res5: l5.type = ListBuffer(2, 3, 4, 5)

scala> l5 ++= (3,4,5)
<console>:13: error: too many arguments for method ++=: (xs: scala.collection.TraversableOnce[Int])l5.type
       l5 ++= (3,4,5)
          ^

scala> l5 ++= List(3,4,5)
res7: l5.type = ListBuffer(2, 3, 4, 5, 3, 4, 5)


scala> l5 -= 2
res8: l5.type = ListBuffer(3, 4, 5, 3, 4, 5)

scala> l5 -= (1,4)
res9: l5.type = ListBuffer(3, 5, 3, 4, 5)
  • 变长转定长
scala> l5 -= (1,4)
res9: l5.type = ListBuffer(3, 5, 3, 4, 5)

scala> l5.toList
res10: List[Int] = List(3, 5, 3, 4, 5)
zipWithIndex

连接起来并创建索引

  val names = List("CXK","苏大强","谢广坤")
  val scores = List(5, 9, 4)

  val results: List[(String, Int)] = names.zip(scores) //将name和score关联起来
  val tmp: List[(((String, Int), Int), Int)] = results.zipWithIndex.zipWithIndex

  /**`   `
    * List里面的数据结构:(((String, Int), Int), Int)
    */
  println(tmp(3)._1._1._1) 

4.set

  • set无序不可重复(因此set可以去重)
scala> val set = Set(1,2,1,3,4,2)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

5. map

定长map

key-value 可变 不可变

scala> val a = Map("tom"->30,"jack"->18)
a: scala.collection.immutable.Map[String,Int] = Map(tom -> 30, jack -> 18)

scala> a("tom")
res11: Int = 30

scala> a("jack")=20
<console>:13: error: value update is not a member of scala.collection.immutable.Map[String,Int]
       a("jack")=20
变长map
scala> val b = scala.collection.mutable.Map("tom"->30,"jack"->18)
b: scala.collection.mutable.Map[String,Int] = Map(jack -> 18, tom -> 30)

scala> b("ann")=10

scala> b
res15: scala.collection.mutable.Map[String,Int] = Map(ann -> 10, jack -> 18, tom -> 30)

scala> b("ann")=11

scala> b
res17: scala.collection.mutable.Map[String,Int] = Map(ann -> 11, jack -> 18, tom -> 30)

scala> b("rr")
java.util.NoSuchElementException: key not found: rr
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.mutable.HashMap.apply(HashMap.scala:65)
  ... 32 elided

#取值一般用getOrElse,不会报错.没设置走默认的,设置了走你的
scala> b.getOrElse("rr",13)
res21: Int = 13

scala> b.getOrElse("jack",13)
res26: Int = 18
scala> b += ("xx"->22)
res28: b.type = Map(ann -> 11, jack -> 18, tom -> 30, xx -> 22)

scala> b -= ("ann")
res30: b.type = Map(jack -> 18, tom -> 30, xx -> 22)

scala> b.contains("ann")
res31: Boolean = false
map遍历方式

1.map拿key

//第一种
val map = Map("longlaoshi" -> 27, "canlaoshi" -> 36, "bolaoshi" -> 31, "jepson" -> 18)

for((k,v) <- map) {
  println(k + " - > " + v)
}

//第二种
for(k <- map.keySet) {
      println(k + "-->" + map.getOrElse(k, -99))//getOrElse 取得到就取,取不到拿默认值
    }

2.map 拿value

for(v <- map.values) {
      println(v)
    }

scala.collection.immutable.SortedMap //可以排序
scala.collection.mutable.LinkedHashMap

6.Option

option有两个子类 some和none.some表示取到了.

scala> val m = Map(1->2)
m: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

scala> m(1)
res32: Int = 2

scala> m(2)
java.util.NoSuchElementException: key not found: 2
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 32 elided

scala> m.get(1)
res35: Option[Int] = Some(2)

scala> m.get(1).get
res36: Int = 2

scala> m.get(2)
res37: Option[Int] = None

scala> m.get(2).get
java.util.NoSuchElementException: None.get
  at scala.None$.get(Option.scala:347)
  at scala.None$.get(Option.scala:345)
  ... 32 elided

scala> m.get(2).getOrElse("None")
res39: Any = None

7.case class

case class 不用new

object CaseClassApp {
  def main(args: Array[String]): Unit = {
    println(Dog("旺财").name)
  }
}

case class Dog(name:String)
  • case class 样例类 必须要有参数列表
scala> case class T1
<console>:1: error: case classes without a parameter list are not allowed;
use either case objects or case classes with an explicit `()' as a parameter list.
case class T1
  • case object 样例对象 必须不能加参数列表
scala> case object T1
defined object T1
面试题:class 和 case class 的区别

case class 重写了toString, equals hashCode
case class 默认就实现了序列化
case class 不用new

8.trait

类似于java中的接口,抽象类

class SparkConf(loadDefaults: Boolean) extends Cloneable with Logging with Serializable


trait Cloneable extends java.lang.Cloneable

继承多个的话,第一个用extends,其他用with

9.模式匹配

* 模式匹配
* 身高
* 腿
* 脸
* 胸
*
*  变量  match {
*     case 颜值 => code
*     case 腿  => code
*     case 身高 => code
*     case 脸   =>  code
*     case _  => 凤姐 芙蓉姐姐
*  }
*
* 匹配内容、匹配类型、匹配集合、匹配case
内容匹配
    val teachers = Array("Aoi Sola", "YuiHatano", "Akiho Yoshizawa")
    val name = teachers(Random.nextInt(teachers.length))

    name match {
      case "YuiHatano" => println("波老师")
      case "Akiho Yoshizawa" => println("吉老师")
      case _ => println("真不知道这位老师是谁")
    }
    
    name
类型匹配
    def matchType(obj:Any) = obj match {
      case x:Int => println("Int")
      case s:String => println("String")
      case m:Map[_,_] => println("Map")
      case _ => println("Other Type...")
    }

    matchType(1)
    matchType(10L)
匹配集合
    def matchList(list:List[String]): Unit = {
      list match {
        case "ruoze"::Nil => println("Hello: ruoze") // 只能匹配只有若泽一个元素
        case x::y::Nil => println(s"Hi: $x , $y") // 能匹配集合中有两个元素的
        case "jack"::tail => println("HI:jack and others") // 匹配jack开头的
        case _ => println("......")
      }
    }

        matchList(List("ruoze"))
        matchList(List("苍老师","泷老师"))
        matchList(List("jack","苍老师","泷老师","波老师"))
        matchList(List("苍老师","泷老师","波老师","jack"))
case class匹配(重要)
object test {
  def main(args: Array[String]): Unit = {


    def matchList(list: List[String]): Unit = {
      val caseclasses = Array(CheckTimeOutTask, HeartBeat(3000), SubmitTask("100", "task100"))

      caseclasses(Random.nextInt(caseclasses.length)) match {
        case CheckTimeOutTask => println("CheckTimeOutTask")
        case HeartBeat(time) => println("HeartBeat")
        case SubmitTask(id, name) => println("SubmitTask")
      }
  }
}


case class SubmitTask(id:String,name:String)
case class HeartBeat(time:Long)
case object CheckTimeOutTask

10. scala 异常的处理 try catch

 val file = "xx.txt"
      try {
        //TODO... 业务逻辑处理
        // open file
        1 / 0
      } catch {
        case e: ArithmeticException => println("除数不能为0...")
        case e: Exception => e.printStackTrace()
      } finally {
        // 资源释放的
        // close
        println("一定会执行....")
      }
    }

11.柯里化( currying or curry )

    def sum(a:Int,b:Int) = a + b
    //println(sum(3,5))

    // Spark源码  Spark SQL UDF
    def sum2(a:Int)(b:Int) = a + b
    println(sum2(4)(6))

12.偏函数

没有match的一组case语句,可以完成模式匹配

    /**
      * 偏函数  PartialFunction
      * A: 输入参数类型
      * B:输出参数类型
      *
      * 包在花括号内没有match的一组case语句
      */
    val teachers = Array("Aoi Sola", "YuiHatano", "Akiho Yoshizawa")
    val name = teachers(Random.nextInt(teachers.length))


    def say:PartialFunction[String,String] = {
      case "YuiHatano" => "波老师"
      case "Akiho Yoshizawa" => "吉老师"
      case _ => "真不知道这位老师是谁"
    }

    println(say(name))

13.文件中读取数据

    val content = Source.fromFile("/Users/hyc/Desktop/FileApp.txt")
    //println(content)

    def read(): Unit ={
      for(line <- content.getLines()){
        println(line)
      }
    }
    read()

补充

1.Nil
Nil是一个空的list集合

scala> Nil
res1: scala.collection.immutable.Nil.type = List()

2.递归实现求和

: _*将1 to 5转化为参数序列

def sum(nums:Int*):Int  = {
      if(nums.length == 0) 0
      else nums.head + sum(nums.tail:_*)
    }

    println(sum(1,2,3,4,5,6))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值