文章目录
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))