Scala高级01
一、重温
1、trait
2、伴生&apply
3、集合:Array List Set Map
二、高阶函数(重点掌握)
1、map:对集合中的每一个元素都做一个操作
object FunctionApp {
def main(args: Array[String]): Unit = {
val l = List(1,2,3,4,5,6,7,8,9)
//TODO... 将集合里面的元素乘以2
//map:对集合中的每一个元素都做一个操作
println(l.map(x => x * 2))
}
}
2、map方法2
_ :代表前面集合里的每一个元素,scala很常见,务必掌握。
println(l.map(_ * 2))
3、遍历输出
.foreach(println)
l.map(_ * 2).foreach(println)
4、带条件的遍历输出
.map().filter()
输出每个元素乘以2之后大于10的元素
println(l.map(_ * 2).filter(_ > 10))
5、取List前三个
.take(3)
l.take(3)
6、reduce函数
两两相邻的元素做某一个操作
(1)reduce(_ + _)
(2)reduce(_ - _)
(3)reduceLeft(_ + _)
l.reduceLeft((a,b) =>{
println(a + ":" + b )
a + b
})
(4)reduceLeft(_ - _)
(5)reduceRight(_ + _)
l.reduceRight((a,b) =>{
println(a + ":" + b )
a - b
})
(7)foldRight(10)((a,b)
l.foldRight(10)((a,b) =>{
println(a + ":" + b )
a - b
})
7、zip函数
a.zip(b)
(1)个数不相等也可以配对
8、flatten
val f = List(List(1,2),List(3,4),List(5,6))
f.flatten-可以把嵌套的结构展开.
9、flatMap:压缩之后再对元素进行操作(flatten + map)
f.flatMap(_.map(_*1))
10、workcount在spark上实现的源码
lines.flatMap(_.split(" ")) ==> 单词
.map(x => (x, 1)) ==> tuple
.reduceByKey(_ + _)
11、Tuple
(1)定义
val a = (1,2,3,4,5)
println(a._1 + " " +a._2)
(2)引申
解析出ip和端口
object TupleApp extends App {
// val a = (1,2,3,4,5)
// println(a._1 + " " +a._2)
val ipPort = "192.168.137.131:9001"
//TODO...解析出IP和端口(ip,port)
val ipStr =ipPort.split(":")
val ip = ipStr(0)
val port = ipStr(1)
println("IP:" + ip )
println("port:" + port)
}
总结:
不是很熟练的时候,可以通过控制台查看类型,会有意想不到的帮助
12、SparkContext.scala里面查看Tuple源码
返回一个Tuple
三、String常用的函数
1、多行字符串
//多行字符串(按三遍"就会出来了)
val b =
"""
|你好,若泽数据
|大数据人工智能培训
|您的选择是正确的
""".stripMargin
println(b)
2、字符串插值
字符串插值 String Interpolation
println(s"hello:$name")
四、实现读文件
1、创建object——FileApp
2、Source
这个方法涉及了两个参数(一个文件、一个隐式转换)
叫做函数柯里化
3、柯里化的解释
(1)创建一个函数
def sum(a:Int,b:Int) = a + b //因为只有一条等式,所以可以省略{}
println(sum(2,4))
(2)再创建一个函数sum2
def sum2(a:Int)(b:Int) = a + b
println(sum2(2)(4))
这种将函数元素分开两个括号的就是函数柯里化的表现
4、Source.fromFile方法
5、getLines方法
6、调用readLine方法
import scala.io.Source
object FileApp extends App {
val file = Source.fromFile("C:\\Users\\dell\\Desktop\\file.txt")
def readLine()={
for (line <- file.getLines()){
println(line)
}
}
readLine()
}
7、研究源码
8、获取API接口的数据
/*
重点掌握
*/
//TODO...读取网页数据
val content = Source.fromURL("http://www.baidu.com")
def readOnLine()={
for (line <- content.getLines()){
println(line)
}
}
readOnLine()
五、异常处理
1、try-catch
捕捉到的异常是ArithmeticException或者是FileNotFoundException的话就抛出新的描述
2、举一反三
object ExceptionApp extends App {
try{
// val i = 1 / 0
val file = Source.fromFile("C:\\Users\\delel\\Desktop\\file2.txt")
}catch {
//模式匹配
case e:ArithmeticException => throw new RuntimeException("除数不能为0")
case e:FileNotFoundException => throw new FileNotFoundException("根据您提供的地址找不到文件")
}finally {
println("finally")
}
}
六、模式匹配
1、模式匹配(scala)
变量 match{
case 值 => 代码
case 值 => 代码
case _ => 代码
}
2、Match方法
import scala.util.Random
object MatchApp {
def main(args: Array[String]): Unit = {
var teacher = Array("Akiho Yashizawa","YuiHatano","Aoi Sola")
val name = teacher(Random.nextInt(teacher.length))
name match {
case "Akiho Yashizawa" => println("吉泽明步老师")
case "YuiHatano" => println("波老师")
case _ => println("不知道你们在说啥")
}
}
}
3、升级的模式匹配
def greeting(array: Array[String])={
array match {
case Array("ruoze") => println("你好,若泽")
case Array(x,y) => println(x + " " + y)
case Array("ruoze",_*) => println("Hi ruoze and everybady")
case _ => println("welcome")//默认
}
}
greeting(Array("ruoze1","laoJ","pkhaha"))
}
4、偏函数
:被包在花括号内没有match的一组case
Scala中的PartialFunction是一个Trait,其类型为PartialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果。
def sayChineseName2(name:String):PartialFunction[String,String] = {
case "Akiho Yashizawa" => "吉泽明步老师"
case "YuiHatano" => "波老师"
case _ => "不知道你们在说啥"
}
println(sayChineseName2("Akiho Yashizawa"))
}
报错:
修改:
def sayChineseName2:PartialFunction[String,String] = {
case "Akiho Yashizawa" => "吉泽明步老师"
case "YuiHatano" => "波老师"
case _ => "不知道你们在说啥"
}
println(sayChineseName2("Akiho Yashizawa"))
}
sayChineseName2(name:String):PartialFunction[String,String]={
case "" => ""
}
这里PartialFunction函数已经把入参出参的类型都定义好了,然后不需要match,模式匹配情况下去掉match。所以可以用以上偏函数达到模式匹配的效果。