大数据编程语言---Scala_01

scala

  • scala介绍

    • 是一个编程语言 多范式 面向对象编程(OOP) 函数式编程(FP)
    • scala是一个运行于jvm平台的语言 最终需要编译成字节码文件运行于jvm
    • scala和java api无缝调用
  • scala 优点

    • 语法灵活 优雅 简洁 速度快
  • scala sdk的安装

    • 注意windows平台和linux平台之间的差异性

    • windows

      SCALA_HOME=C:\Work\soft\scala-2.11.8
      PATH=;%SCALA_HOME%\bin
      
    • linux

      export SCALA_HOME=/export/servers/scala-2.11.8
      export PATH=$PATH:$SCALA_HOME/bin
      
  • scala开发插件

    • 推荐在线插件安装

scala基础语法

  • 常量、变量

    • 常量指的是程序运行中不要修改变化的量 用val修饰

    • 变量指的是程序运行中需要修改变化的量 用var修饰

      val  常量名 :类型 =  值
      var  变量名 :类型 =  值
      
      scala中名称在前  类型在后 大多数时候 类型可以省略不写 scala编译器可以自动推导
      
  • 数据类型

    • 种类和java一样 大小写敏感

    • 在scala中 数据类型本质都是对象 因此基于数据类型的+ - * / 操作都是对象的方法

      scala> 1 + 1
      res0: Int = 2
      
      scala> 1.+(1)
      res1: Int = 2
      
  • 条件表达式

    • 语法比java更加灵活 {}如果只有一个表达式 可以省略不写

    • 支持混合类型表达式

      val b = if (a > 1) 1 else "allen"
      
  • Any

    • 在scala中 Any是所有对象共同父类 超级父类 所有类都是其子类
    • Any有两个直接子类
      • AnyVal 所有基本类型的父类
      • AnyRef 所有引用类型的父类
  • scala Unit

    • 在scala 中Unit表示空 相当于java中void Unit有一个唯一的实例 ()
  • 代码块

    • 用{}括起来的一段代码逻辑称之为代码块
    • 代码块的执行的结果是最后一个表达式的结果
  • to 方法

    1 to 10
    res4: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)  返回一个含头含尾的区间range
    
    1 until 10
    scala> 1 until 10
    res33: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
    返回一个含头不含尾的区间
    
  • for循环

    • 格式

      for (形式参数  <- 表达式|数组|集合)
      scala> val a1 = Array(11,12,13)
      a1: Array[Int] = Array(11, 12, 13)
      
      scala> for(i <- a1) println(i)
      
    • for推导式

      在for加上yield关键字 关键字后面跟上表达式 可以把表达式作用于for循环结果 返回构成一个新的集合

      a1: Array[Int] = Array(11, 12, 13)
      
      scala> for (i <- a1) yield i * 10
      res6: Array[Int] = Array(110, 120, 130)
      
  • 方法的定义

    • 识别方法的重点是关键字 def

    • 格式

      def 方法名(参数名1:类型,参数名2:类型...):返回类型 = {方法体}
      
    • 注意事项

      • 针对返回结果类型 通常情况下可以不写 但是递归方法除外 需要指定返回结果类型

      • 针对方法体 如果逻辑简单 {}可以省略不写

      • 针对输入参数列表 如果是无参数输入 ()也可以省略不写

        def sayHello = println("hello")
        
  • 函数的定义

    • 识别函数的重点是 =>

    • 格式

      val 函数名称 = (参数名1:类型,参数名2:类型...) => {函数体}
      scala> val f1 = (x :Int,y :Int)=> x + y
      f1: (Int, Int) => Int = <function2>
      
      scala> f1(1,2)
      res16: Int = 3
      
    • 注意事项

      • 如果没有常量或者变量引用 函数称之为匿名函数
      • 函数体简单 可以{}省略不写
      • 也可以定义无参数函数
  • 方法和函数的区别

    • 在函数式编程语言中 函数是头等公民

    • 函数本身是对象 具有自己的方法 每个函数都是FunctionN的实例 N表示函数的参数个数

      andThen   apply   compose   toString
      
    • 函数可以当做成其他数据类型 一样 作为参数传递给方法

    • 通常情况下 使用匿名函数作为参数传递

      scala> def m1(x:Int,y:Int) = x+y    普通方法 接受两个int类型参数  返回一个int
      m1: (x: Int, y: Int)Int
      
      scala> def m2(f:(x:Int,y:Int)=>Int)=f(2,3)   定义格式错误 
      <console>:1: error: ')' expected but ':' found.
      def m2(f:(x:Int,y:Int)=>Int)=f(2,3)
                 ^
      
      scala> def m2(f:(Int,Int)=>Int)=f(2,3)  特殊方法 接受一个参数 类型为函数
      m2: (f: (Int, Int) => Int)Int           且要求是输入两个int 返回一个int的函数
      
      scala> val f1 =(x:Int)=>x+1           函数:接受一个int 返回一个int
      f1: Int => Int
      
      scala> val f2 =(x:Int,y:Int)=>x+y     函数:接受两个int 返回一个int
      f2: (Int, Int) => Int
      
      scala> m2(f2)      f2符合m2的参数类型  就可以把函数作为参数传递给方法
      res0: Int = 5
      
      scala> m2((x:Int,y:Int)=>x+y)     以匿名的形式传递给方法
      res1: Int = 5
      
    • 方法可以转化成为函数 神奇的下划线

      scala> def m2(f:(Int,Int)=>Int)=f(2,3)
      m2: (f: (Int, Int) => Int)Int
      
      scala> def m1(x:Int,y:Int) = x+y
      m1: (x: Int, y: Int)Int
      
      scala> m1 _
      res6: (Int, Int) => Int = <function2>
      
      scala> m2(m1 _)
      res7: Int = 5
      
      scala> m2(m1)  使用隐式转换把方法变成函数
      res8: Int = 5
      
      相当于:
      scala> val f1 = m1 _    先把m1方法转化成为函数f1
      f1: (Int, Int) => Int = <function2>
      
      scala> m2(f1)  f1作为参数传递m2
      res9: Int = 5
      
      

数组Array

  • scala中数组分为定长数组Array 变长数组ArrayBuffer

  • 所谓的长指的是长度是否可以发生改变

  • 不管是定长还是变长 创建的时候有两种方式 有初始值 没有初始值

    • 定长数组Array

      val a1 = Array(元素1,元素2,元素3,元素4)  不需要new  底层调用apply方法帮我们new
      
      val a2 = new Array[元素类型](数组长度)
      
    • 变长数组ArrayBuffer(使用前需要导包 import scala.collection.mutable.ArrayBuffer)

      val a3 = ArrayBuffer(元素1,元素2,元素3,元素4)  不需要new  底层调用apply方法帮我们new
      
      val a2 = new ArrayBuffer[元素类型]
      
  • 变长数组操作

    增加元素
    	a1 += 元素
    	a1.append(元素)
    删除元素
    	a1 -= 元素
    	a1.remove(元素的角标)
    
    • 遍历数组

      for循环遍历
      for(a <- a3) println(a)
      

集合

  • Map映射

    • Map分为可变map和不可变Map 默认情况下是不可变Map

    • 定义格式是完全一样的 区别导包的差异

    • 定义格式

      val m1 = Map(k1 -> v1,k2 -> v3,k3 -> v3)
      val m2 = Map((k1,v1),(k2,v2),(k3,v3))
      
    • map操作

      • 针对不可变Map

        获取值:
        m1(k1) = v1
        m1.get(k1) = v1
        
        m1.getOrElse(k1,默认值)
        
        m1.keySet
        m1.Keys
        
      • 针对可变Map

        手动导包import scala.collection.mutable.Map

        查看操作和上述不可变的一样
        
        元素值的修改:
        m1(k1) = 新k
        增加元素
        m1 += (k3->v3)
        m1 += ((k3,v3))
        删除元素:只需要指定key就可以
        m1 -= (k1)
        m1.remove(k1)
        
      • map遍历

        for(i <- m1.Keys) println(m1(i))  for循环遍历
        for((x,y) <- m1) println(x+"---->"+y) 模式匹配遍历  重点掌握
        
  • Tuple 元组

    • 不同类似数据的聚集 用小括号把一堆不同类型的数据括起来

    • 如果元组只有两个元素 称之为对偶元组 map映射是对偶元组的集合

    • 定义格式

      val t1 =(元素1,元素2,元素3)
      
      scala内置了22个TupleN对象  可以直接new TupleN对象创建元组
      val t2 = new Tuple3(元素1,元素2,元素3)
      
    • 元组数据的获取

      _1  _2 _3  下标是从1开始的
      
    • 元组的遍历

      Tuple.productIterator() 获取迭代器 进行遍历
      
  • 列表List

    • 分为两大类 不可变List 和可变ListBuffer

    • 定义格式

      • 不可变List

        val l1 = List(元素1,元素2)
        
      • 可变listBuffer import scala.collection.mutable. ListBuffer

        val l2 = ListBuffer[Int](元素1,元素2)
        
      • 特殊符号

        • head 返回集合的一个元素
        • tail 返回的是除了第一个元素之外其他所有元素构成的集合
        • Nil 表示的是一个空集合 List()
    • 列表的操作

      针对不可变List 
      +: 在集合的头部添加元素
      scala> 10 +: l1
      res68: List[Int] = List(10, 11)
      
      scala> l1.+:(10)
      res72: List[Int] = List(10, 11)
      
      :: 在集合的头部添加元素
      scala> 10 :: l1
      res74: List[Int] = List(10, 11)
      
      :+ 在集合尾部添加元素
      scala> l1 :+ 10
      res76: List[Int] = List(11, 10)
      
      scala> l1.:+(10)
      res77: List[Int] = List(11, 10)
      
      针对可变ListBuffer
      元素增加  +=  append
      元素删除  -=  remove
      scala> l1 += 14
      res82: l1.type = ListBuffer(11, 12, 13, 14)
      
      scala> l1
      res83: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 12, 13, 14)
      
      scala> l1.append(15)
      
      scala> l1
      res85: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 12, 13, 14, 15)
      
      scala> l1 -= 12
      res86: l1.type = ListBuffer(11, 13, 14, 15)
      
      scala> l1
      res87: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 13, 14, 15)
      
      scala> l1.remove(2)
      res88: Int = 14
      
  • Set集合

    • 分为两大类 可变Set 不可变Set 默认情况下是不可变的

    • 针对可变的Set 需要自己手动导包 import scala.collection.mutable.Set

    • 定义格式

      val s1 = Set(元素1,元素2)
      
    • 特点: 元素不重复(去重) 元素无序(没有角标概念)

    • 操作

      += add
      -= remove  注意remove是通过元素移除的
      

面向对象

  • 对象

    • class 普通对象 需要new 获取对象的实例 通过实例调用对象的属性和方法

    • object 全局唯一实例对象 不需要new 里面方法和属性都是静态的 直接类名.方法 类名.属性

      • 通常把main方法写在object中 作为程序的入口

        def main(args :Array[String]):Unit ={
            
        }
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值