• 2023_Spark_实验四:SCALA基础


    一、在IDEA中执行以下语句

    或者用windows徽标+R  输入cmd 进入命令提示符

    输入scala直接进入编写界面

    1、Scala的常用数据类型

    注意:在Scala中,任何数据都是对象。例如:

    1. scala> 1
    2. res0: Int = 1
    3. scala> 1.toString
    4. res1: String = 1
    5. scala> "1".toInt
    6. res2: Int = 1
    7. scala> "abc".toInt
    8. java.lang.NumberFormatException: For input string: "abc"
    9. at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    10. at java.lang.Integer.parseInt(Integer.java:580)
    11. at java.lang.Integer.parseInt(Integer.java:615)
    12. at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:272)
    13. at scala.collection.immutable.StringOps.toInt(StringOps.scala:29)
    14. ... 32 elided

    1. 数值类型:Byte,Short,Int,Long,Float,Double

    Byte: 8位有符号数字,从-128 到 127

    Short: 16位有符号数据,从-32768 到 32767

    Int: 32位有符号数据

    Long: 64位有符号数据

    例如:

    val a:Byte = 10

    a+10

    得到:res9: Int = 

    这里的res9是新生成变量的名字

    val b:Short = 20

    a+b

    注意:在Scala中,定义变量可以不指定类型,因为Scala会进行类型的自动推导。

    2. 字符类型和字符串类型:Char和String

        对于字符串,在Scala中可以进行插值操作。

    1. scala> val s1="Hello World"
    2. s1: String = Hello World
    3. scala> "My Name is ${s1}"
    4. res4: String = My Name is ${s1}
    5. scala> s"My Name is ${s1}"
    6. res5: String = My Name is Hello World

    3. Unit类型:相当于Java中的void类型

    1. scala> val f=()
    2. f: Unit = ()
    3. scala> val f={}
    4. f: Unit = ()

    4. Nothing类型:一般表示在执行过程中,产生了Exception

    例如,我们定义一个函数如下:

    1. scala> def myfunction=throw new Exception("Some Error")
    2. myfunction: Nothing

    2、Scala变量的申明和使用

    使用val和var申明变量

    例如:scala> val answer = 8 * 3 + 2 可以在后续表达式中使用这些名称

    val:定义的值实际是一个常量

    要申明其值可变的变量:var

    注意:可以不用显式指定变量的类型,Scala会进行自动的类型推到

    3、Scala的函数和方法的使用

    可以使用Scala的预定义函数

    例如:求两个值的最大值

    1. scala> max(1,2)
    2. :12: error: not found: value max
    3.        max(1,2)
    4.        ^
    5. scala> import scala.math._
    6. import scala.math._
    7. scala> max(1,2)
    8. res7: Int = 2
    9. scala> var result:Int=max(1,2)
    10. result: Int = 2

    也可以使用def关键字自定义函数

    语法:

    1. //求两个参数的和
    2. def sum(x:Int,y:Int):Int=x+y
    3. sum(1,2)
    4. var d=sum(1,2)
    5. //求每个数学的阶乘
    6. def myFactor(x:Int):Int={
    7. //采用递归算法得到阶乘
    8. //注意:在SCALA 中,if..else 是一个表达式,所有有返回值,相当于省略的return
    9. if (x<=1)
    10. 1
    11. else
    12. x*myFactor(x-1)
    13. }
    14. myFactor(5)

    4、Scala的条件表达式

    Scala的if/else语法结构和Java或C++一样。

    不过,在Scala中,if/else是表达式,有值,这个值就是跟在if或else之后的表达式的值。

    5、Scala的循环

    Scala拥有与Java和C++相同的while和do循环

    Scala中,可以使用for和foreach进行迭代

    使用for循环案例:

    1. //定义一个集合
    2. var list=List("Mary","Tom","Mike")
    3. println("************for 第一种写法************")
    4. for (s<-list) println(s)
    5. println("************for 第二种写法************")
    6. for {
    7. s<-list
    8. if(s.length>3)
    9. } println(s)
    10. println("************for 第三种写法************")
    11. for (s<-list if s.length<=3) println(s)

    注意:

    (*) <- 表示Scala中的generator,即:提取符

    (*)第三种写法是第二种写法的简写

    在for循环中,还可以使用yield关键字来产生一个新的集合

    1. //定义一个集合
    2. var list=List("Mary","Tom","Mike")
    3. println("************for 第四种写法************")
    4. var newList= for {
    5. s<-list
    6. s1=s.toUpperCase
    7. } yield (s1)

    使用while循环:注意使用小括号,不是中括号

    1. println("************while 循环************")
    2. var i=0
    3. while(i
    4. println(list(i))
    5. i+=1
    6. }

    使用do ... while循环

    1. println("************do while 循环************")
    2. var i=0
    3. do {
    4. println(list(i))
    5. i+=1
    6. }while (i

    使用foreach进行迭代

    1. scala> val list=List("Mary","Tom","Mike")
    2. list: List[String] = List(Mary, Tom, Mike)
    3. scala> list.foreach(println)
    4. Mary
    5. Tom
    6. Mike

    注意:在上面的例子中,foreach接收了另一个函数(println)作为值

    6、Scala函数的参数

    Scala中,有两种函数参数的求值策略

    Call By Value:对函数实参求值,且仅求一次

    Call By Name:函数实参每次在函数体内被用到时都会求值

    1. //Scala中函数参数的求值策略
    2. // 1.call by value
    3. def test1(x:Int,y:Int):Int=x+x
    4. test1(3+4,8)
    5. //2. call by name
    6. def test2(x: => Int,y: =>Int):Int=x+x
    7. test2(3+4,8)

    稍微复杂一点的例子:

    x是call by value,y是call by name

    def bar(x:Int,y: => Int):Int = 1

    定义一个死循环

    def loop():Int = loop

    调用:

    bar(1,loop) //输出1

    bar(loop,1) //死循环

    我们来分析一下,上面两个调用执行的过程:

    Scala中的函数参数

    默认参数

    代名参数

    可变参数

    1. //默认参数
    2. def func1(name:String="Tom"):String ="Hello "+name
    3. func1()
    4. func1("marry")
    5. //带名参数
    6. def func2(str:String="Good Morning",name:String="Tom",age:Int=20)=str+name+" and the age of "+name + " is "+age
    7. func2()
    8. func2(age=25)
    9. //变长参数:求多个数字的和
    10. def sum(args:Int*)={
    11. var result=0
    12. for(arg<-args) result+=arg
    13. result
    14. }

    7、Scala的Lazy值(懒值)

    当val被申明为lazy时,它的初始化将被推迟,直到我们首次对它取值。

    1. val x:Int =10
    2. //定义y的时候才有lazy来休息,在定义它时候不会对其运算
    3. lazy val y:Int=x+1
    4. //第一次使用的时候,才会对其求值
    5. y

    一个更为复杂一点的例子:读取文件:

    1. //第一次读取一个存在的文件
    2. val words=scala.io.Source.fromFile("d:\\temp\\a.txt").mkString
    3. lazy val words1=scala.io.Source.fromFile("d:\\temp\\a.txt").mkString
    4. words1
    5. //第二次读取一个不存在的文件,这时不会报错
    6. lazy val words2=scala.io.Source.fromFile("d:\\temp\\abc.txt").mkString
    7. //第一次调用的时候,才会对其运算,才会出现Exception
    8. words2

    8、异常的处理

    Scala异常的工作机制和Java或者C++一样。直接使用throw关键字抛出异常。

    使用try...catch...finally来捕获和处理异常:

    1. //1.采用 try catch finally 来捕获异常和处理异常
    2. try{
    3. val words=scala.io.Source.fromFile("d:\\temp\\abc.txt").mkString
    4. } catch {
    5. case ex:java.io.FileNotFoundException => {
    6. println("File Not Found")
    7. }
    8. case ex:IllegalArgumentException => {
    9. println("Illegal Argument Exception")
    10. }
    11. case _:Exception =>{
    12. println("*****Other Exception ****")
    13. }
    14. }finally {
    15. println("****** final block ******")
    16. }
    17. //2.如果一个函数的返回类型是Nothing, 表示:在函数执行的过程中产生异样
    18. def func1()=throw new IllegalArgumentException("Some Error Happened")
    19. //3.if else 语句:如果在一个分支中产生了异常,则另外一个分支的返回值,将作为 if else 返回值的类型
    20. val x=10
    21. if(x>10){
    22. scala.math.sqrt(x)
    23. }else{
    24. throw new IllegalArgumentException("The value should be not")
    25. }

    9、Scala中的数组

    Scala数组的类型:

    定长数组:使用关键字Array

    1. //定长数组
    2. val a=new Array[Int](10)
    3. val b=new Array[String](5)
    4. val c=Array("Tom","Mary","Mike")

    变长数组:使用关键字ArrayBuffer

    1. //变长数组: ArrayBuffer
    2. val d = scala.collection.mutable.ArrayBuffer[Int] ()
    3. //往变长数组中加入元素
    4. d+=1
    5. d+=2
    6. d+=3
    7. //往变长数组中加入多个元素
    8. d+=(10,12,13)
    9. //去掉最后两个值
    10. d.trimEnd(2)
    11. d.trimStart(2)
    12. //将ArrayBuffer 转换成Array
    13. d.toArray

    遍历数组

    1. //遍历数组
    2. var a=Array("Tom","Mary","Mike")
    3. //使用for 循环进行遍历
    4. for (s<-a) println(s)
    5. //对数组进行转换,新生成一个数组 yield
    6. val b = for {
    7. s<-a
    8. s1=s.toUpperCase
    9. }yield (s1)
    10. //可以使用foreach进行循环输出
    11. a.foreach(println)
    12. b.foreach(println)

    Scala数组的常用操作

    1. import scala.collection.mutable.ArrayBuffer
    2. val myArray = Array(1,10,2,3,5,4)
    3. //求最大值
    4. myArray.max
    5. //求最小值
    6. myArray.min
    7. //求和
    8. myArray.sum
    9. //定义一个变长数组
    10. var myArray1=ArrayBuffer(1,10,2,3,5,4)
    11. //排序
    12. myArray1.sortWith(_ > _)
    13. //升序
    14. myArray1.sortWith(_ < _)

    Scala的多维数组

    和Java一样,多维数组是通过数组的数组来实现的。

    也可以创建不规则的数组,每一行的长度各不相同。

    1. //定义一个固定长度的二维数组
    2. val matrix = Array.ofDim[Int](3,4)
    3. matrix(1)(2)=10
    4. matrix
    5. //定义一个二维数组,其中每个元素是一个一维数组,其长度不固定
    6. val triangle = new Array[Array[Int]](10)
    7. //通过一个循环赋值
    8. for(i<-0 until( triangle.length)) triangle(i)=new Array[Int](i+1)
    9. //观察这个二维数组中的每一个元素的长度
    10. triangle

    10、映射

    映射就是Map集合,由一个(key,value)组成。

    -> 操作符用来创建

    映射的类型分为:不可变Map和可变Map

    1. //不可变得Map
    2. val math = scala.collection.immutable.Map("Alice"->80,"Bob"->95,"Mary"->70)
    3. //可变的Map
    4. val english = scala.collection.mutable.Map("Alice"->80,"Bob"->95,"Mary"->70)
    5. val chinese = scala.collection.mutable.Map(("Alice",80),("Bob",95),("Mary",70))

    映射的操作

    获取映射中的值

    1. //1.获取Map中的值
    2. chinese("Bob") //chinese.get("Bob")
    3. //chinese("Tom") 如果不存在,会抛出 Exception
    4. //Map.constains 判断可以时候存在
    5. if(chinese.contains("Alice")){
    6. chinese("Alice")
    7. }else{
    8. -1
    9. }
    10. //简写
    11. chinese.getOrElse("Alice",-1)

    迭代映射

    1. //迭代映射
    2. for (s<-chinese) println(s)
    3. chinese.foreach(println)

    11、元组(Tuple)

    元组是不同类型的值的聚集。

    例如:val t = (1, 3.14, "Fred") // 类型为Tuple3[Int, Double, java.lang.String]

    这里:Tuple是类型,3是表示元组中有三个元素。

    元组的访问和遍历:

    1. //定义tuple,包含3个元素
    2. val t1=(1,2,"Tom")
    3. val t2= new Tuple4("Mary",3.14,100,"Hello")
    4. //访问tuple中的组员 _1
    5. t2._1
    6. t2._2
    7. t2._3
    8. t2._4
    9. //t2._5 ---->error
    10. //遍历 Tuple: for foreach ???
    11. t2.productIterator.foreach(println)
    12. //注意:要遍历Tuple中的元素,需要首先生成对应的迭代器,不能直接使用for 或者 foreach

  • 相关阅读:
    【Java基础】· 集合习题详解
    log4j2安全漏洞修复
    Spring的web集成 (Spring监听器)
    51单片机点阵
    ios ipa包上传需要什么工具
    Linux高性能服务器编程——ch4笔记
    大数据-之LibrA数据库系统告警处理(ALM-12046 网络写包丢包率超过阈值)
    电磁铁常见故障有哪些
    js-gerenator-async异步迭代器错误处理及+promise
    wires hark抓包内容解析
  • 原文地址:https://blog.csdn.net/pblh123/article/details/132623887