美文网首页
函数式编程与scala 入门

函数式编程与scala 入门

作者: 无火余灰 | 来源:发表于2019-01-17 17:37 被阅读0次

    scala

    预备知识

    1. 命令式编程 和 函数式编程
      • 函数式编程关心类型(代数结构)之间的关系
      • 命令式编程关心解决问题的步骤
      • 我们刚开始入门学习的都是命令式编程,其精髓,用指令告诉机器要怎样做,更像是我们为计算机制造一个流水线,机器按照指令顺序执行
      • 函数式编程,其精髓,是在使用表达式(计算)来表达程序,但大多数时候还是会化成指令进项行的
      • 所谓的编程范式只是程序员看待程序的看法。

    scala 特性

    1. 语言特性
      • 运行在jvm上,因此理所因当的,编写完,会编译成java 的 class 。由于这种特性,scala天生就可以使用所有的java包。
      • 具有类型推断的静态类型语言。
              var a = 1
              var a = "123"     //报错的啦,愚蠢的人类
        
      • 面向对象 + 函数式编程的 多范式语言。
      • 拥有解释器。
    2. 部分应用(偏应用函数)
      • 使用神奇的通配符“_” 替换函数中的参数,可以得到另一个函数
         def adder(m: Int, n: Int) = m + n                     
         val add2 = adder(2, _:Int)                            //使用通配符得到一个新函数
         add2(3)
      
    3. 柯里化函数
      • 将一个多参函数 柯里化后,变为每次都只接受一个参数并且返回一个新的接收剩余参数的函数
                def multiply(m: Int)(n: Int): Int = m * n
                val timesTwo = multiply(2) _
                
        
    4. 可变参数
      * 都9102年了,这就不用讲了吧
    5. 类: 构造函数
      • 构造函数不是特殊的方法,他们是除了类的方法定义之外的代码;
                  Calculator(brand: String) {
                  /**
                  * A constructor.
                    */
                  val color: String = if (brand == "TI") {
                    "blue"
                  } else if (brand == "HP") {
                      "black"
                  } else {
                      "white"
                  }
        
                // An instance method.
                def add(m: Int, n: Int): Int = m + n
             }
        
    6. 特质(Traits)
      • 字段和行为的集合;可以扩展和混入你的类中。可以当做java中的接口,通过组合灵活的实现新功能的切入
                  trait Car {
                            val brand: String
                  }
        
                 trait Shiny {
                          val shineRefraction: Int
                              }
                 class BMW extends Car with Shiny {
                        val brand = "BMW"
                        val shineRefraction = 12
                            }
        
    7. apply 方法
      • 可以认为是当使用类名作为函数时,调用的实际函数
                         object Greeting{
                               def apply(name: String) = "Hello " + name
                           }
                         Greeting("colin") 实际就是在调用apply
        
    8. 单例对象
      • scala中没有静态变量,通过定义一个单例对象来获得想要的功能
      • 非伴生的单例对象,不与任何类有关联,可以定义很多方法,作为工具类,或者作为程序入口
      • 伴生对象,与伴生类同名,需要定义在同一文件,可以与伴生类互相访问私有成员。
    9. 函数即对象
      • 或者说 对象即函数,实际上是指 一个对象,通过继承Functionl 特质,继承了apply方法,使得我们可以通过objectName()调用对象中apply(),看起来就像是函数了。
    10. 模式匹配和样本类
      • 模式匹配,可以初步的认为是switch case。
      • 样本类是用来方便储存和匹配类的内容的。
    11. 集合的连接操作符
      • List:"::",":::"
           1 :: 2 :: 3 :: Nil, var fruit = fruit1 ::: fruit2
        
      • Set:"++"
           val fruit1 = Set("apples", "oranges", "pears")
           val fruit2 = Set("mangoes", "banana")
           var fruit = fruit1 ++ fruit2
        
      • Map: "+","++"
           A + = ('I' -> 1)
           val colors1 = Map("red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F")
           val colors2 = Map("blue" -> "#0033FF", "yellow" -> "#FFFF00", "red" -> "#FF0000")
           var colors = colors1 ++ colors2
        
      • PS: +: 在头部添加,:+ 在尾部添加

    相关文章

      网友评论

          本文标题:函数式编程与scala 入门

          本文链接:https://www.haomeiwen.com/subject/wfkidqtx.html