• scala quick check


    Scala 特性
     
    面向对象特性
    函数式编程
    Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。
    静态类型
    Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。
    并发性
    Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。
     
    Scala 基础语法
    我们可以认为 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递。
     
    引用
    Scala 使用 import 关键字引用包。
    // 重命名成员 import java.util.{HashMap => JavaHashMap} // 隐藏成员 import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了
     
     
    Scala 访问修饰符
    私有(Private)成员
    class Outer{ class Inner{ private def f(){println("f")} class InnerMost{ f() // 正确 } } (new Inner).f() //错误 }
     
    保护(Protected)成员
    package p{ class Super{ protected def f() {println("f")} }     class Sub extends Super{      f()     }     class Other{         (new Super).f() //错误     } }
     
    公共(Public)成员
    class Outer { class Inner { def f() { println("f") } class InnerMost { f() // 正确 } } (new Inner).f() // 正确因为 f() 是 public }
     
     
    Scala 方法与函数
    Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。
    Scala 中使用 val 语句可以定义函数,def 语句定义方法。
     
    class Test{ def m(x: Int) = x + 3 val f = (x: Int) => x + 3 }
     
     
    方法声明
    Scala 方法声明格式如下:
    def functionName ([参数列表]) : [return type]
     
     
    Scala 函数传名调用(call-by-name)
    Scala的解释器在解析函数参数(function arguments)时有两种方式:
    • 传值调用(call-by-value):先计算参数表达式的值,再应用到函数内部;默认的调用方式
    • 传名调用(call-by-name):将未计算的参数表达式直接应用到函数内部
    object Test { def main(args: Array[String]) { delayed(time()); } def time() = { println("获取时间,单位为纳秒") System.nanoTime } def delayed( t: => Long ) = { println("在 delayed 方法内") println("参数: " + t) t } }
     
    以上实例中我们声明了 delayed 方法, 该方法在变量名和变量类型使用 => 符号来设置传名调用。执行以上代码,输出结果如下:
    $ scalac Test.scala $ scala Test 在 delayed 方法内 获取时间,单位为纳秒 参数: 241550840475831 获取时间,单位为纳秒
     
     
    Scala 匿名函数
    Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体。
    var inc = (x:Int) => x+1
     
    上述定义的匿名函数,其实是下面这种写法的简写:
    def add2 = new Function1[Int,Int]{     def apply(x:Int):Int = x+1; }
     
    Scala 函数柯里化(Currying)
    柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。
    实例
    首先我们定义一个函数:
    def add(x:Int,y:Int)=x+y
    那么我们应用的时候,应该是这样用:add(1,2)
    现在我们把这个函数变一下形:
    def add(x:Int)(y:Int) = x + y
    那么我们应用的时候,应该是这样用:add(1)(2),最后结果都一样是3,这种方式(过程)就叫柯里化。
     
    Scala Trait(特征)
    Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
    与接口不同的是,它还可以定义属性和方法的实现。
    一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。
    Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示:
    trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean = !isEqual(x) }
    以上Trait(特征)由两个方法组成:isEqual 和 isNotEqual。isEqual 方法没有定义方法的实现,isNotEqual定义了方法的实现。子类继承特征可以实现未被实现的方法。所以其实 Scala Trait(特征)更像 Java 的抽象类。
     
    使用样例类
    使用了case关键字的类定义就是就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配。
    以下是样例类的简单实例:
    object Test { def main(args: Array[String]) {     val alice = new Person("Alice", 25)     val bob = new Person("Bob", 32)     val charlie = new Person("Charlie", 32) for (person <- List(alice, bob, charlie)) {     person match { case Person("Alice", 25) => println("Hi Alice!") case Person("Bob", 32) => println("Hi Bob!") case Person(name, age) => println("Age: " + age + " year, name: " + name + "?") } } } // 样例类 case class Person(name: String, age: Int) }
     

  • 相关阅读:
    [经验交流] kubernetes v1.11 更新了高可用方案
    Java泛型和编译优化的一个例子
    Java泛型和编译优化的一个例子
    Java泛型和编译优化的一个例子
    浅析JSONP-解决Ajax跨域访问问题
    java设计原则---开闭原则
    for,foreach,iterator的用法和区别
    List,Set,Map三种接口的区别
    为什么接口中定义的变量必须为常量?
    重写,string创建内存问题
  • 原文地址:https://www.cnblogs.com/gm-201705/p/9533095.html
Copyright © 2020-2023  润新知