实验楼学习Scala语言的笔记,课程网址为https://www.shiyanlou.com/courses/490

  一、Scala简介

    Scala 是一门多范式的编程语言,类似于 Java 。设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。

    在线 Scala 编译器Scalakata.com。

    Scala环境安装(略)。

    假设有一个Scala程序的文件HelloWorld.scala

      编译 scalac  HelloWorld.scala

      运行 scala HelloWorld

      注:编译之后的文件后缀为.class

    HelloWorld.scala文件内容如下:

object HelloWorld{
def main(args:Array[String]){
println("Hello,World")
}
}

  二、步入Scala前的准备

    1. Scala交互式解释器

      :help - 查看帮助

      :quit - 退出Scala交互式解释器

      在Scala解释器中输入  1+2

      则解释器会输出 res0: Int = 3

        - res0 是Scala解释器自动生成的变量名

        - : 冒号

        - Int 数据类型

        - = 等于号

        - 3 计算结果

    2. 定义变量

      Scala定义了两种类型的变量 var 和 val;

        val : 类似与Java中的final,初始化之后不能再重新赋值,称之为常变量;

        var : 初始化之后可以重新赋值。

      例如: val msg:String = "Hello,World"

        变量类型  变量名[:数据类型] = 变量值

      变量类型 可以不指定,Scala会根据赋值内容推算出变量的类型。

      Scala也不需要分号(;)结尾

    3. 定义函数

      Scala 既是面向对象的编程语言,也是面向函数的编程语言。因此函数在 Scala 语言中的地位和类是同等第一位的。

      函数的定义以def开头,格式如下 def  函数名(参数名:类型[,......])[ : 返回类型] = { 代码 }

      例如: def  max(x:Int, y:Int):Int = {

            if(x>y) x

            else y

          }

      Scala表达式都是返回结果,函数的最后一个表达式的值就可以作为函数的结果返回,Scala避免使用return。可以没有返回类型,即Unit,相当于Java的void。

      同样由于 Scala 的“ type inference ”特点,本例其实无需指定返回值的类型。对于大多数函数 Scala 都可以推测出函数返回值的类型,但目前来说回溯函数(函数调用自身)还是需要指明返回结果类型的。

    4. 编写Scala脚本

      Scala 本身是设计用来编写大型应用的,但它也可以作为脚本语言来执行,脚本为一系列 Scala 表达式构成以完成某个任务,比如前面的 Hello World 脚本,你也可以使用脚本来实现一些比如复制文件,创建目录之类的任务。

    5. while配合使用if实现循环      

var i=0
while (i < args.length) {
println (args(i))
i+=1
}

      Scala不支持 ++i 和 i++ 运算符;Scala访问数组的语法是使用()而非[];以上实现循环的方式并不是最好的Scala风格。

    6. 使用foreach和for来

      第5点使用while实现不符合Scala的风格,应该采用“函数式”风格来编写代码。

      例如: args.foreach(arg => println(arg))

        调用args的foreach方法,传入一个参数

      若一个函数只有一个参数并且只包含一个表达式,则无需明确指明参数。上述代码还可以精简如下: args.foreach(println)

      Scala还提供了功能强大的for表达式,比Java中的for功能强大的多了。后面再述。

      先看看for吧。 for(arg <- args) println(arg)

    7. 使用类型参数化数组

      var greetStrs = new Array[String](3)

      greetStrs(0)="Hello"

      greetStrs(1)=","

      greetStrs(2)="World\n"

      for(i <- 0 to 2)

        print(greetStrs(i))

      0 to 2 相当于 (0).to(2)

      Scala中所有的基本数据类型也是对象。

      Scala对方法的名称没有太多的限制,开发人员可以使用符号作为方法的名称。

      使用()相当于调用该对象的apply方法。

        greetStrs(0) 相当于 greetStrs.apply(0)

      greetStrs(0) = "Hello" 相当于 greetStrs.update(0,"Hello")

      另一种定义数组的方法: var greetStrs = Array("Hello",",","World\n")

    8. 使用List

      Scala兼有面向对象编程语言的特点,即调用某个方法不应该有任何副作用,参数一定,调用该方法返回一定的结果,而不会去修改程序的其他状态(副作用)。

      数组的元素是可以被修改的,如果需要使用不可修改的序列,Scala提供了List类。

      val oneTwo = List(1,2)

      val threeFour = List(3,4)

      val ontTwoThreeFour = oneTwo ::: threeFour

      ::: 操作符(其实为::: 方法)将两个列表连接起来,实际是新创建一个oneTwoThreeFour对象

      List也提供了一个 :: 方法用来向List中添加一个元素。

      :: 方法(操作符)是右操作符,也就是使用 :: 右边的对象来调用它的 :: 方法。

      Scala中规定所有以 : 开头的操作符都是右操作符

      List类还定义了 head、last、length、reverse、tail等其他方法

    9. 元组(Tuples)

      元组可以包含不同数据类型的数据。在方法需要返回多个结果时非常的有用。

      可以使用 ._ 和 索引 来访问元组的元素,索引从1开始

      Scala支持的元组的最大长度为22。目前是这样的。

      Scala中的元组用 () 定义

        var pair = (99, "test")

        println(pair._1)

        println(pair._2)

    10. Sets和Maps

      Scala 语言的一个设计目标是让程序员可以同时利用面向对象和面向函数的方法编写代码,因此它提供的集合类分成了可以修改的集合类和不可以修改的集合类两大类型。

      比如 Array总是可以修改内容的,而 List 总是不可以修改内容的。类似的情况,Scala 也提供了两种 Sets 和 Map 集合类。

      Set集合

        可修改时使用全包名: var  jetSet = Scala.collection.mutable.Set("Bating", "shanghai")

        直接使用类名定义时可以修改: var  jetSet = Set("Bating", "shanghai")

      Map集合

        可修改时使用全包名: var  jetMap = Scala.collection.mutable.Map("Bating", "shanghai")

        直接使用类名定义时可以修改: var  jetMap = Set("Bating", "shanghai")

    11. 函数式编程风格

      简单的说函数式编程就是尽量不使用 var

      Java和C#为指令式编程思想

      Scala编程原则: 能不用 vars,尽量不用 vars,能不用 mutable 变量,尽量不用 mutable 变量,能避免函数的副作用,尽量不产生副作用

    12. 读取文件

      代码

      import  scala.io.source

      var args = Source.fromFile("/home/aston/test.txt")

      for(line <- args.getLines)

        println(line.length + "  " + line)

      以上代码是一行一行读取文件内容。注意先在相应的目录下创建文件test.txt并输入内容

  三、 类和对象入门

      Scala 类定义和 Java 非常类似,也是以 class 开始,和 Java 不同的,Scala 的缺省修饰符为public,也就是如果不带有访问范围的修饰符 public 、protected、private 等,Scala 将默认定义为 public 。

      类的方法以 def 定义开始,要注意的Scala的方法的参数都是 val类型,而不是 var 类型,因此在函数体内不可以修改参数的值

      类的方法分两种,一种是有返回值的,一种是不含返回值的,没有返回值的主要是利用代码的“副作用”,比如修改类的成员变量的值或者读写文件等。Scala 内部其实将这种函数的返回值定为 Unit(类同 Java 的 void 类型),对于这种类型的方法,可以省略掉 = 号

      Scala 比 Java 更加面向对象,这是因为 Scala 不允许类保护静态元素(静态变量或静态方法)。在 Scala 中提供类似功能的是成为“ Singleton(单例对象)”的对象。

      伴侣对象( companion )

      单例对象( singleton )

      Traint,相当于Java的interface,不过可以有方法的实现

  四、 基本数据类型及其操作

    Scala的数据类型都是对象

    Scala支持隐式自动转换  ,因为如此,所以Scala可以对数据类型扩展

    数据类型

      整数类型: Byte、Short、Int、Long和Char

      浮点型: Float、Double

      字符型: String

      布尔型: Boolean

    Scala中字面量也支持方法

    算术运算符: + - * /

    关系和逻辑运算符: <  >  <=  >=  !   &&  || 等

    逻辑运算符支持 短路 运算

    位操作符: &  |  ^  ~

    对象恒等比较: == 和 !=

    1. 运算符的优先级和左右集合

      Scala 的操作符的优先级和 Java 基本相同,可以使用 () 改变操作符的优先级。

      操作符一般为左结合,Scala 规定了操作符的结合性由操作符的最后一个字符定义。对于以 : 结尾的操作符都是右结合,其它的操作符多是左结合

Scala学习随笔——Scala起步的更多相关文章

  1. Scala学习(一)--Scala基础学习

    Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...

  2. Scala学习随笔——深入类和对象

    函数化对象(又称方程化对象)指的是所定义的类或对象不包含任何可以修改的状态. 本篇随笔就是着重记录函数化对象.定义了一个有理数类定义的几个不同版本,以介绍 Scala 类定义的几个特性:类参数和构造函 ...

  3. Scala学习随笔——控制语句

    Scala只内置了为数不多的几种程序控制语句:if.while.for.try catch以及函数调用,这是因为从Scala诞生开始就包含了函数字面量,Scala内核没有定义过多的控制结构,而是可以通 ...

  4. Scala学习(五)---Scala中的类

    Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...

  5. Scala学习——Brief Scala Tutorial

    因为Spark项目需要,学习Scala编程. 从官网文档入手:http://www.scala-lang.org/documentation/ 首先从他的Older Documentation入手. ...

  6. Scala学习1————scala开发环境搭建(windows 10)

    Scala开发环境搭建 先讲几点我学习scala的目的或者原因吧: JVM在企业中的霸主地位,Scala也是JVM上的语言,很有可能未来会从Java过度到Scala也不是不可能. 先进的函数式编程和面 ...

  7. Scala学习(八)---Scala继承

    Scala继承 摘要: 在本篇中,你将了解到Scala的继承与Java和C++最显著的不同.要点包括: 1. extends.final关键字和Java中相同 2. 重写方法时必须用override ...

  8. Scala学习(六)---Scala对象

    Scala中的对象 摘要: 在本篇中,你将会学到何时使用Scala的object语法结构.在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,你就会用到它.本篇的要点包括: 1. ...

  9. Scala学习资源

    Scala学习资源: Scala官方网站:http://www.scala-lang.org/ Scala github:https://github.com/scala/scala Twitter ...

随机推荐

  1. MyBatis---简单增删改查的带事物的例子

    本例子包含了对数据库表简单的增删改查的操作,并且包含事物.该例子只适用于MySQL数据库.该例子需要手动创建数据库以及数据库表 例子中所需要的jar包,详查MyBatis---简介 一个entity类 ...

  2. Android 如何在xmL 里面动态设置padding

    如题,Android 如何在xmL 里面动态设置padding 有时候,你的布局加载完成之后,你findViewByid 找到控件,设置padding 会导致白条,布局闪动,那怎么办呢? 你是不是就想 ...

  3. cycling -avoid the vicious cycle

    ‘Numerous' studies in the past appear to have shown a link between cycling and ED. The researchers a ...

  4. shell编程——

    一.分支语句 语法:(多路分支) case word in patterm1) list A ;; pattern2) list B ;; patternN) list N ;; esac例子:cas ...

  5. nodejs 操作mongodb, 增删改查

    很久没有学node了,之前书看了一半,今天继续学发现版本问题很坑爹,按书例子执行一堆错误.想学nodejs操作db,百度半天,一堆sb写神马鸟玩儿?简简单单写一大堆还运行不了的.需要代码也是看别人写的 ...

  6. Windows Phone 图片扩展类

    using System.IO; using System.Text; using System.Net; using System.Threading.Tasks; using System.Win ...

  7. Python导出sql语句结果到Excel

    本文档是因为每周需要统计线上数据库中客户新增资源,手动执行实在是麻烦,就写了个脚本导出到Excel,顺便发一封邮件. (当然这不是线上的真实脚本,不过根据个人需求稍微修改下,还是可以直接用的.拿去不谢 ...

  8. 哲学家就餐-同步问题解析-python

    五个哲学家吃五盘通心粉,由于通心粉很滑,所以必须要拿起左右两边的叉子才能吃到. 叉子的摆放如图所示. 那么问题来了:能为每一个哲学家写一段描述其行为的程序,保证不会出现死锁. 解法1:让他等待能够使用 ...

  9. 洛谷P1071潜伏者(提高组)

    题目描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于S国的R 国间谍小C终于摸清了 S 国军用密码的编码规则: 1. S国军方内部欲发送的原信息经过加密后在网 ...

  10. golang中从一个日期开始往后增加一段时间

    废话少说上code, 这个是从当前日期开始,往后增加一个月时间 package main import ( "fmt" "time" ) func main() ...