浅谈Scala

124 阅读4分钟

前言

什么是Scala?

是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性 。Scala 运行于Java平台( Java虚拟机 ),并兼容现有的Java程序

为什么要学习Scala

  1. 优雅
  2. 静态编译,和Jruby,Groovy比速度会快很多
  3. Scala语言能力强,一行代码能抵上多行Java代码,开发速度快
  4. 能快速融合到Hadoop生态圈

基础语法

数据结构

  • Byte
  • Char
  • Short
  • Int
  • Long
  • Float
  • Double
  • Unit

流程控制

  • 条件表达式
  • 循环语句
  • yield关键字

函数式编程

函数定义

  1. 函数可以声明在任意的位置,方法只能声明在类中
  2. 函数名称和方法名称相同,默认情况下会调用函数.如果没有函数,会调用方法
  3. this.method,是指向的方法
object Scala01_Fun {
  
  def main(args: Array[String]): Unit = {

    // TODO 函数 & 方法
    // 函数可以声明在任意的位置,方法只能声明在类中
    def test(): Unit = {
      println("funtion")
    }

    // 函数名称和方法名称相同,默认情况下会调用函数.如果没有函数,会调用方法
    test()

    // 函数的本质就是Java中的方法
    // Scala源码中,方法就是函数,编译后字节码中,函数就是方法
    // 函数编译成方法时,增加了修饰符,private static final

  }

  def test(): Unit = {
    println("method")
  }

}

函数至简原则

object Scala06_Fun_NightMare {


  def main(args: Array[String]): Unit = {


    // TODO 函数式编程 - 噩梦版
    // 函数式编程的匿名函数与至简原则

    def test(f: (Int, Int) => Int): Unit = {
      val i: Int = f(10, 20)
      println(i)
    }

    def sum(x: Int, y: Int): Int = {
      x + y
    }

    def diff(x: Int, y: Int): Int = {
      x - y
    }

//    val i: Int = sum(10, 20)
//    println(i)

    test(sum)
    test(diff)


    test((x, y) => x - y)
    test(_ + _)

    def fun(f:(String) => Unit): Unit = {
      f("zhagnsan")
    }

    fun(
      (name: String) => println(name)
    )

    fun(println(_))
    fun(println)

  }



}

函数作为参数

def main(args: Array[String]): Unit = {

  // TODO 函数作为参数

  def fun(i : Int): Int = {
    i * 2
  }

  def fun2(f: Int => Int) = {
    f(10)
  }

  println(fun2(fun))


}

函数作为值

object Scala05_Fun_NightMare {

  def main(args: Array[String]): Unit = {

    // TODO 函数式编程 - 噩梦版


    def test(): Unit = {

    }

    def test1(age :Int): String = {
      age.toString
    }

    // 将函数对象test赋值给f
    // 函数回写的类型称之为函数类型
//    val f = test _
//    val f: Function0[Unit] = test _
//    println(f)


    val f:Function1[Int, String] = test1 _
    println(f)

    println(f(2))

    // TODO 函数参数的个数没有限制
    // 函数对象的参数最多只有22个
  }

}

匿名函数

def main(args: Array[String]): Unit = {

  // TODO 函数式编程 - 噩梦版
  // 函数式编程的匿名函数与至简原则

  def cal(x:Int, f:(Int,Int)=>Int, y:Int){
    println(f(x, y))
  }

  cal(10, _ - _, 30)
  cal(10, _ * _, 30)
  cal(10, _ + _, 30)
  cal(10, _ / _, 30)

}

嵌套函数

// 嵌套函数
def outer() = {
  def inner() = {
    println("hello")
  }
  inner _
}

outer()()

控制抽象

闭包

  • 闭包的使用是改变函数的声明完成的
object Scala08_Fun_NightMare {


  def main(args: Array[String]): Unit = {

    // TODO 函数式编程 - 噩梦版
    // TODO 闭包

    def outer(x: Int)={
      def inner(y: Int)= {
        x + y
      }
      inner _
    }

    println(outer(10)(9))

    () => { println("hello world") }

  }

}

  • 总结
  • 内部函数使用了外部的数据,改交数据的生命周期
  • 将函数作为对象使用,改变函数本身的生命周期
  • 所有匿名函数都有闭包
  • 内部函数返回到外部使用也会有闭包

函数柯里化

    // TODO 函数柯里化

//    def test(a: Int, b: Int): Unit = {
//      for (i <- 1 to a) {
//        println(i)
//      }
//      for (i <- 1 to b) {
//        println(i)
//      }
//    }

    // 函数参数之前可能没有任何关系,那么如果在传值的时候同时传递,其实就有耦合性,而且增加调用的难度
    // 所谓的柯里化,就是为了将函数简化,将无关的参数进行分离,可以设定多个参数列表
//    test(10, 5)

    def test(a: Int)(b: Int): Unit = {
      for (i <- 1 to a) {
        println(i)
      }
      for (i <- 1 to b) {
        println(i)
      }
    }

    val intToUnit: Int => Unit = test(10)
    intToUnit(5)

递归函数

惰性函数

面向对象编程

  • 抽象
  • 封装
  • 继承
  • 多态
  • Object单例对象
  • 特质
  • Super关键字

集合

  • Java更关注数据结构,Scala更关心集合本身的功能
  • Scala中的绝大多数结合对象都是通apply方法构建出来
  • Seq
  • Set
  • Map
  • 数组
  • Tuple元组

模式匹配

  • match
  • 匹配类型
  • 匹配元组
  • 匹配对象
  • 偏函数

异常

  • Scala异常没有分类,没有throws关键字
  • 与Java像是又不尽相同

隐式转换

  • 关键字:implicit
  • 隐式转换作用域

泛型

  • 协变
  • 逆变

正则表达式