1.  Scala解释器读到一个表达式,对它进行求值,将它打印出来,接着再继续读下一个表达式。这个过程被称作“读取-求值-打印-循环”,即REPL

  2.  从技术上来讲,scala程序并不是一个解释器,实际发生的是:你输入的内容被快速地编译成字节码,然后这段字节码交由Java虚拟机执行。

  3.  声明值和变量

  val answer = 8 * 5 + 2  //val定义常量

  answer:Int = 42

  var counter = 0 //var声明变量

  counter = 1 //ok,可以改变一个var

不需要给出常量或变量的类型,这个信息可以从初始化它的表达式推断出来;必要的时候,也可以指定类型。

  val greeting : String = "Hello"  //变量或函数的类型总是在变量或者函数名称的后面

在变量声明或者复制语句后,不需要使用分号。仅当同一行代码中存在多条语句时才需要分号隔开

  val xmax, ymax = 100//多个值或变量可放在一起声明

  var greeting, message : String = null

4.Scala中常用数据类型有7种:Byte、Char、Short、Int、Long、Float、Double、Boolean,这些类型都是。Scala还提供了RichInt、RichDouble、RichChar等,具备更多的便捷方法。还有BigInt和BigDecimal类,用于任意大小(但有穷)的数字。

  1.toString() //产生字符串"1";可以使用Tab键补全使用的方法名

  1.to(10)  //产出Range(1,2,3,4,5,6,7,8,9,10),1先被转化为RichInt,然后再应用to方法。

在Scala中,我们不需要包装类型。在基本数据类型和包装类型之间的转换是Scala编译器的工作。例如:创建一个Int数组,最终在虚拟机中得到的是一个int[]数组。

  在Scala中,我们使用方法,而不是强制类型转换,来做数值类型之间的转化。例如99.44.toInt得到90,99.toChar得到'c',"99.5".toDouble
得到99.5,toString将任意对象转换成字符串。

5.算数和操作符重载

  Scala的算术操作符和Java中预期的效果是一样的,特别的是这些操作符实际上是方法。例如:

    a + b 是如下方法调用的简写:

    a .+(b)

通常可以用  a 方法 b  作为  a.方法(b)   的简写,这里的方法是一个带有两个参数的方法(一个隐式的和一个显式的)。例如: 1.to(10) 可以写成 1 to 10

  Scala并没有提供++和--操作符,使用+=或者-=:

    counter += 1   (无法简单地实现一个名为++的方法,因为Int类是不可变的,这样一个方法并不能改变某个整数类型的值。)

6.调用函数和方法

  除了方法外,Scala还提供函数。相比Java,Scala中使用数学函数更为简单,不需要从某个类调用它的静态方法

    sqrt(2) //将产出1.4142135623730951

    pow(2,4)  //将产出16.0

    min(3,Pi)//将产出3.0

  这些函数时scala。math包中定义的。使用如下语句引入

    import  scala.math._  //在Scala中,_ 字符是通配符,类似Java中的*

    import  包名._    即可

  Scala没有静态方法,不过它有个类似的特性,叫做单例对象(singleton object)

  通常一个类对于有一个伴生对象(companion object),其方法就跟Java中的静态方法一样。例如:BigInt类的BigInt伴生对象有一个生成指定位数的随机素数的方法probablePrime:

    BigInt.probablePrime(100,scala.util.Random)

  BigInt.probalbePrime这样的调用和Java中的静态方法调用和类似。

  这里的Random是一个单例的随机数生成器对象,而该对象是在scala.util包中定义的。这里是单例对象比比类更好的为数不多的场景之一。在Java中,为每个随机数都构造出一个新的java.util.Random对象是一个常见的错误。

  不带参数的Scala方法通常不使用圆括号()。

    "Hello".distinct  //获取字符串中不重复的字符,StringOps类中的方法

  一般来说,没有参数且不改变当前对象的方法不带圆括号。

7. apply方法

    在Scala中,我们通常都会使用类似函数调用的语法。例如:

  如果s是一个字符串,那么s(i)就是该字符串的第i个字符。(在Java中你会写s.charAt(i))

    "Hello"(4)//将产出'o'

  你可以把这种方法当做是()操作符的重载形式,它背后的实现原理是一个名为apply的方法。例如,在StringOps类的文档中,你会发现这样一个方法:

    def apply(n : Int) : Char

    也就是说,"Hello"(4)是如下语法的简写:

    "Hello".apply(4)

  如下调用

   BigInt("1234567890")

  是如下语法的简写:

    BigInt.apply("1234567890")

  这个语句产出一个新的BigInt对象,不需要使用new。

  像这样使用伴生对象的apply方法是Scala中构建对象的常用手法。例如,Array(1,4,9,16)返回一个数组,用的就是Array伴生对象的apply方法。

8. Scaladoc

   Scaladoc中每个类名旁边的O和C分别链接到对应的类(C)或伴生对象(O)。

   数学函数位于scala.math包中。

   标记为implicit(暗示的)的方法对应的是自动(隐式)转换。

   方法可以以函数作为参数:def count(p: (Char) => Boolean) : Int//count 方法需要传入一个接受单个Char并返回true或者false的函数。

   Range和Seq[Char]一个是数字区间,一个是字符序列。

   

快学Scala 1的更多相关文章

  1. 快学Scala习题解答—第一章 基础

    1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...

  2. 《快学Scala》

    Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...

  3. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  4. 快学Scala 2

    控制结构和函数 1.在Scala中,几乎所有构造出来的语法结构都有值.这个特性是为了使得程序更加精简,也更易读. (1)if表达式有值 (2)块也有值——是它最后一个表达式的值 (3)Scala的fo ...

  5. [Scala] 快学Scala A3L3

    Actor 通过尽可能避免锁和共享状态,actor使得我们能够容易地设计出正确.没有死锁或争用状况的程序. Scala类库提供了一个actor模型的简单实现.AKKA是更高级的actor类库. 19. ...

  6. [Scala] 快学Scala A2L2

    集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...

  7. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

  8. 快学Scala第一部分

    转载: 1.变量声明 val answer = 8 * 5 + 2; //常量 var counter = 0;    //变量 //在必要的时候 ,可以指定类型 val greeting:Strin ...

  9. 《快学Scala》——数组、映射和元组

    数组 定长数组:在Scala中可以用Array,初始化一个定长数组.例如: val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new ...

  10. 《快学Scala》——控制结构和函数

    条件表达式 在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值.例如: if (x > 0) 1 else -1 上述表达式的值是1或-1,具体是哪一个取决于x ...

随机推荐

  1. NUC972---Linux驱动开发

    驱动开发是嵌入式 Linux 产品开发的重要组成部分,驱动是将芯片底层与Linux应用连接起来的桥梁.驱动程序的好坏直接影响和决定着产品的稳定性,稳定的驱动程序是产品可靠性的基石. 编写 Linux ...

  2. OpenGL——二维几何变换

    平移.旋转.缩放的实现 #include<iostream> #include <math.h> #include<Windows.h> #include < ...

  3. kubernetes-PetSet

    什么是Pet?Pet是一个有状态应用程序,本质上它是一个具有确定性名称以及唯一身份的Pod,身份内容包括: DNS中可以识别的固定hostname 顺序化索引(Pet名称组成:PetSetName-O ...

  4. 版本控制 version control和团队协作

    这些技术你可能暂时不会用到,但是一旦软件体量变大,开发人数增加,这就带来质变,需要借助一些工具或者技术才能完成这些复杂的工程. 你可以从最简单的情况思考,你可以对任何类型的文件进行版本控制,比如一个p ...

  5. spring框架学习感悟

    学习了一段时间的spring,但是在练习时老是出现bug,一方面,框架封装了很多东西,简化了开发,但是万一出现问题,就很难排查.这说明应该找个慢慢的熟悉它,并且掌握它. 在这个过程中,可能要不断地试错 ...

  6. MINIUI后台获取数据

    1.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  7. vsCode配置C++调试环境

    1.下载安装VSCode,安装mscpptools ,直接搜索c++,或者mscpptools 2.下载MinGW 安装好,一般默认安装到C:\MinGW 安装好后直接启动. 选择需要的gcc ,g+ ...

  8. iOS自定义结构体

    一.提要 通过以官方的CGSize为例,自定义Objective-C中的结构体,并使用. 二.CGSize 1.系统定义的CGSize结构体 struct CGSize { CGFloat width ...

  9. 查找->动态查找表->键树(无代码)

    文字描述 键树定义 键树又叫数字查找树,它是一棵度大于或等于2的树,树中的每个结点中不是包含一个或几个关键字,而是只含有组成关键字的符号.例如,若关键字是数值,则结点中只包含一个数位:若关键字是单词, ...

  10. Appium入门(8)__控件定位

    部分摘自:http://www.testclass.net/appium/appium-base-find-element/ appium 通过 uiautomatorviewer.bat 工具来查看 ...