scala 2.11.7学习笔记1之概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/undergrowth/article/details/78846978

scala 2.11.7学习笔记1之概述

参考

概念

名词

  • 可扩展语言/是面向对象与函数式编程加入静态类型的混合体
  • scala像集市而非大教堂,兼容性/简洁/高级抽象/高级静态类型化
  • Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库
object HelloWorld {
    def main(args: Array[String]): Unit = {
        println("Hello, world!")
    }
}
  • Scala是一种纯面向对象的语言,每个值都是对象,每个操作都是方法的调用,对象的数据类型以及行为由类和特质描述
  • Scala也是一种函数式语言,其函数也能当成值来使用,当做参数/返回值/定义匿名函数,方法不应该有副作用
  • Scala使用Actor作为其并发模型,在2.10之后的版本中,使用Akka作为其默认Actor实现

Scala 基础语法

  • Scala 语句末尾的分号 ; 是可选的
  • 区分大小写/类名/方法名称/程序文件名—-与java类似 (驼峰)
  • def main(args: Array[String]) - Scala程序从main()方法开始处理,Scala程序的强制程序入口部分
  • Scala 关键字不同于java—-def/forSome/implicit/match/lazy/sealed/trait/val/var/type
  • Scala 类似 Java 支持单行和多行注释—-// /* */
  • Scala 包—-package com.runoob/import java.awt._
  • 默认情况下,Scala 总会引入 java.lang._ 、 scala._ 和 Predef._
  • Boolean/Byte Char/Short Int/Float/ Long/Double/ String/Unit/Null/Nothing/Any/AnyRef
    • scala类层次—-21种
    • Any
    • AnyVal—-Boolean/Byte Char/Short Int/Float/ Long/Double/ Unit(java void)——–9
      • 值类以方法的名称支持运算符
    • AnyRef(java.lang.Object)—-ScalaObject/Iterable/Seq/List java对象/scala对象 String Null/Nothing——–9
  • ‘<标识符>/’/”/”“”/var/val/类型推断
    • VariableName : DataType [= Initial Value]—-与java相反
    • +—-字符串连接
  • private,protected,public/默认情况下,Scala对象的访问级别都是 public/
    • Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员
    • 保护(Protected)成员,因为它只允许保护成员在定义了该成员的的类的子类中被访问
    • 写成private[x],读作”这个成员除了对[…]中的类或[…]中的包中的类及它们的伴生对像可见外,对其它所有类都是private
  • if else 与java一致/while 循环与java一致/for(val 常量 <-(其中) 变量组)—-发生器(to/until)—-yield产生新的集合
    • if/while/for/try/match/函数调用—-能够产生某个值
    • try/catch/finally—-catch/case
    • match/case—- _表示默认情况—-更简洁的使用
  • Scala 函数—-Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法
    • def functionName ([参数列表]) : [return type]—-比java多了def,类型在名称之后
    • :[return type]可省略,类型推断器会推断,{}如果是一行语句,也可省略
    • 不写等于号和方法主体,那么方法会被隐式声明为”抽象(abstract)”,包含它的类型于是也是一个抽象类型
    • functionName( 参数列表 )
    • 函数式编程风格—-函数是一等民—-函数字面量(一行时,可省略)—-(右箭头/=>)—-函数体
    • 类中方法/本地嵌套方法/函数字面量(使用=>)/闭包捕获了变量本身/重复参数(*)/尾递归
    • 指令式编程风格—-
    • 指令转函数—-尽量不使用var编程/尽量函数完全无副作用(除了返回值,对主调函数无任何影响)
  • 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量
    • 高阶函数—-带其他函数做参数的函数
    • 柯里化—-柯里化的函数被应用于多个参数列表
    • 借贷模式—-打开资源,并贷出给函数,关闭资源
    • 如果只传入一个参数,可使用花括号替换小括号
    • 传名参数,参数的类型开始与=>,而不是()=>,
  • Scala 中,字符串的类型实际上是 Java String,它本身没有 String 类。/new StringBuilder
  • var z = new ArrayString/var z = Array(“Runoob”, “Baidu”, “Google”)
    • 数组以0开始,z(0)而不是java的z[0]
    • Array[String]—-属于类型参数,3—-值参数
    • 任何对于对象的值参数应用将都被转换为对apply方法的调用/对带有括号并包含参数赋值时,转换为对对象的update方法调用
  • Scala Collection—-可变的和不可变的集合
    • List(Nil)/同类型/不可变—-::(方法被右操作数调用)/:::/foreach/length/mkString/isEmpty
    • Tuple/不同类型/不可变—-元祖实例化对象放入()/以.与_与数字为1开始的索引访问/par._1
    • map/set—-默认为不可变/也有可编辑支持,引入不同包即可
  • 任何对象都能调用的->机制被称为隐式转化(implicit conversion)
    • Boolean/Byte Char/Short Int/Float/ Long/Double/ String/Unit/Null/Nothing/Any/AnyRef
    • 前缀操作符(+/-/!/~)/中缀操作符/后缀操作符
    • scala操作符就是方法调用,scala基本类型的富变体的隐式转换可以增加更多有用的方法
  • Scala 类和对象()—-Scala中的类不声明即为public,一个Scala源文件中可以有多个类/Scala 的类定义可以有参数
    • class/new/var/val(方法参数为val)/def(带花括号没有等号相当于Unit结果类型的方法)/private(只能在类内部)
    • singleton object—-与java静态类类似/虚构类的名称是对象名加上一个美元符号
    • companion object—-类和伴生对象可相互访问其私有成员
    • standalone object—-
    • 函数式对象—-任何不具有可改变状态的对象的类
    • 重写一个非抽象方法必须使用override修饰符、只有主构造函数才可以往基类的构造函数里写参数
    • 在子类中重写超类的抽象方法时,你不需要使用override关键字/Scala 只允许继承一个父类
    • Scala 中,是没有 static 这个东西的,object对象不能带参数
    • scala 中没有 static 关键字对于一个class来说,所有的方法和成员变量在实例被 new 出来之前都是无法访问的,
    • 因此class文件中的main方法也就没什么用了,scala object 中所有成员变量和方法默认都是 static 的所以 可以直接访问main方法
    • 在scala中,类名可以和对象名为同一个名字,该对象称为该类的伴生对象,
    • 类和伴生对象可以相互访问他们的私有属性,但是他们必须在同一个源文件内。
  • Scala Trait(特征)—-与接口不同的是,它还可以定义属性和方法的实现
    • 它使用的关键字是 trait
    • Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承
    • Scala中也是一般只能继承一个父类,可以通过多个with进行多重继承
  • 包(package)与引用(import)
    • 包可以嵌套/同一文件可放置不同包/顶层的包被当成root包的成员
    • 按需引用()/可以出现在任何地方/使用{}表示选择引用/原始名=>新名 可重命名引用/原始名=> 隐藏
    • 隐式引用—-java.lang./scala./Predef._
  • 断言与单元测试—-assert
    • assert/ensuring
    • 需要进一步尝试
  • Scala 模式匹配—-选择器 match {备选项}
    • 一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了
      一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式
    • case关键字的类定义就是就是样例类(case classes),样例类是种特殊的类,经过优化以用于模式匹配
  • Scala 正则表达式—-http://www.runoob.com/scala/scala-regular-expressions.html
  • Scala 异常处理—-throw new IllegalArgumentException/与java类似
    • catch字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后
  • Scala 提取器(Extractor)
    • Scala 提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作:
    • unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值
    • 在我们实例化一个类的时,可以带上0个或者多个的参数,使用unapplySeq
    • 编译器在实例化的时会调用 apply 方法。我们可以在类和对象中都定义 apply 方法
  • Scala 文件 I/O—-Scala 进行文件写操作,直接用的都是 java中 的 I/O 类 (java.io.File):

Code

猜你喜欢

转载自blog.csdn.net/undergrowth/article/details/78846978