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))
  }
}

Scala高级01

2、map方法2

_ :代表前面集合里的每一个元素,scala很常见,务必掌握。

  println(l.map(_ * 2))

Scala高级01

3、遍历输出

.foreach(println)


l.map(_ * 2).foreach(println)

Scala高级01

4、带条件的遍历输出

.map().filter()

输出每个元素乘以2之后大于10的元素

println(l.map(_ * 2).filter(_ > 10))

5、取List前三个

.take(3)

l.take(3)

6、reduce函数

两两相邻的元素做某一个操作

(1)reduce(_ + _)

Scala高级01

(2)reduce(_ - _)

Scala高级01

(3)reduceLeft(_ + _)


l.reduceLeft((a,b) =>{
    println(a + ":" + b )
    a + b
})

Scala高级01

Scala高级01

(4)reduceLeft(_ - _)

Scala高级01

(5)reduceRight(_ + _)


l.reduceRight((a,b) =>{
    println(a + ":" + b )
    a - b
})

Scala高级01

Scala高级01

(7)foldRight(10)((a,b)


l.foldRight(10)((a,b) =>{
    println(a + ":" + b )
    a - b
})

Scala高级01

Scala高级01

7、zip函数

a.zip(b)

Scala高级01

(1)个数不相等也可以配对

Scala高级01

8、flatten


val f = List(List(1,2),List(3,4),List(5,6))

Scala高级01

f.flatten-可以把嵌套的结构展开. 

Scala高级01

9、flatMap:压缩之后再对元素进行操作(flatten + map)


f.flatMap(_.map(_*1))

Scala高级01

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)

Scala高级01

(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源码

Scala高级01

返回一个Tuple

三、String常用的函数

1、多行字符串


//多行字符串(按三遍"就会出来了)
  val b =
  """
    |你好,若泽数据
    |大数据人工智能培训
    |您的选择是正确的
  """.stripMargin
  println(b)

Scala高级01

2、字符串插值

字符串插值 String Interpolation

println(s"hello:$name")

Scala高级01

四、实现读文件

1、创建object——FileApp

Scala高级01

2、Source

Scala高级01

Scala高级01

这个方法涉及了两个参数(一个文件、一个隐式转换)

叫做函数柯里化

3、柯里化的解释

(1)创建一个函数


def sum(a:Int,b:Int) = a + b //因为只有一条等式,所以可以省略{}
println(sum(2,4))

Scala高级01

(2)再创建一个函数sum2


def sum2(a:Int)(b:Int) = a + b
println(sum2(2)(4))

Scala高级01

这种将函数元素分开两个括号的就是函数柯里化的表现

4、Source.fromFile方法

Scala高级01

5、getLines方法

Scala高级01

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()
}

Scala高级01

7、研究源码

Scala高级01

Scala高级01

8、获取API接口的数据


/*
  重点掌握
 */
  //TODO...读取网页数据
    val content = Source.fromURL("http://www.baidu.com")

    def readOnLine()={
      for (line <- content.getLines()){
        println(line)
      }
    }
    readOnLine()

五、异常处理

1、try-catch

Scala高级01

捕捉到的异常是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")
    }
}

Scala高级01

六、模式匹配

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("不知道你们在说啥")
    }
  }
}

Scala高级01

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"))
}

Scala高级01

报错:

Scala高级01

修改:

Scala高级01


       def sayChineseName2:PartialFunction[String,String] = {
            case "Akiho Yashizawa" => "吉泽明步老师"
            case "YuiHatano" => "波老师"
            case _ => "不知道你们在说啥"
}
        println(sayChineseName2("Akiho Yashizawa"))
}

Scala高级01

sayChineseName2(name:String):PartialFunction[String,String]={

        case "" => ""

 

}

这里PartialFunction函数已经把入参出参的类型都定义好了,然后不需要match,模式匹配情况下去掉match。所以可以用以上偏函数达到模式匹配的效果。