Scala自学笔记

对于有其他语言基础的朋友来说,三天怼完Scala并不是什么难事;如果没有其他语言基础的话,可能要花很多时间来理解里面的一些东西,看这篇博客的意义并不大,推荐去菜鸟教程看更加详细的scala教程。此外,个人建议,不要选择scala或者python这类语言作为入门的语言,入门语言个人首推java(不喜勿喷),当然也可以选择C或者其他。

git传送门:https://github.com/ZzzzZzreal/ScalaDemo

一、Scala的特性

1.面向对象特性

Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。

类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。 

2.函数式编程

Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scalacase class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。

更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。

3.静态类型

Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。类型系统具体支持以下特性:

   泛型类

   协变和逆变

   标注

   类型参数的上下限约束

   把类别和抽象类型作为对象成员

   复合类型

   引用自己时显式指定类型

   视图

   多态方法

4.扩展性

Scala的设计秉承一项事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:

   任何方法可用作前缀或后缀操作符

   可以根据预期类型自动构造闭包。

5.并发性

Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。

二、Scala语法

1、Scala的数据类型

Scala 与 Java有着相同的数据类型,下表列出了 Scala 支持的数据类型:

数据类型

描述

Byte

8位有符号补码整数。数值区间为 -128 到 127

Short

16位有符号补码整数。数值区间为 -32768 到 32767

Int

32位有符号补码整数。数值区间为 -2147483648 到 2147483647

Long

64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807

Float

32IEEE754单精度浮点数

Double

64IEEE754单精度浮点数

Char

16位无符号Unicode字符区间值为 U+0000 到 U+FFFF

String

字符序列

Boolean

truefalse

Unit

表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()

Null

null 或空引用

Nothing

Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。

Any

Any是所有其他类的超类

AnyRef

AnyRef类是Scala里所有引用类(reference class)的基类

上表中列出的数据类型都是对象,也就是说Scala没有java中的原生类型。在Scala是可以对数字等基础类型调用方法的。 

   ☆空值是 Scala.Null 类型。

   ☆Scala.NullScala.Nothing是用统一的方式处理Scala面向对象类型系统的某些"边界情况"的特殊类型。

   ☆Null类是null引用对象的类型,它是每个引用类(继承自AnyRef的类)的子类。Null不兼容值类型。

2、Scala的变量

   val 声明常量(相当于javafinal)   var声明变量

Scala 支持多个变量的声明:

   val xmax, ymax = 100  // xmax, ymax都声明为100

3、Scala的方法(又叫函数)---传值函数,传名函数,可变参数,高阶函数,匿名函数等例子参见9代码笔记

Def 方法名(参数名:数据类型)[返回值类型]={方法体}

返回值类型可以不写,直接返回方法体代码的最后一行的值

4、Scala的类和对象

详见另一篇博客 《代码笔记》

5、Scala 的正则

Scala 的正则表达式继承了 Java 的语法规则,Java 则大部分使用了 Perl 语言的规则。

下表我们给出了常用的一些正则表达式规则:(前两列和后两列没什么关系,只是为了节省篇幅)

表达式

匹配规则

 

实例

描述

^

匹配输入字符串开始的位置。

.

匹配除"\r\n"之外的任何单个字符。

$

匹配输入字符串结尾的位置。

[Rr]uby

匹配 "Ruby" 或 "ruby"

.

匹配除"\r\n"之外的任何单个字符。

rub[ye]

匹配 "ruby" 或 "rube"

[...]

字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"

[aeiou]

匹配小写字母 :aeiou

[^...]

反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain""p""l""i""n"

[0-9]

匹配任何数字,类似 [0123456789]

\\A

匹配输入字符串开始的位置(无多行支持)

[a-z]

匹配任何 ASCII 小写字母

\\z

字符串结尾(类似$,但不受处理多行选项的影响)

[A-Z]

匹配任何 ASCII 大写字母

\\Z

字符串结尾或行尾(不受处理多行选项的影响)

[a-zA-Z0-9]

匹配数字,大小写字母

re*

重复零次或更多次

[^aeiou]

匹配除了 aeiou 其他字符

re+

重复一次或更多次

[^0-9]

匹配除了数字的其他字符

re?

重复零次或一次

\\d

匹配数字,类似: [0-9]

re{ n}

重复n

\\D

匹配非数字,类似: [^0-9]

re{ n,}

 

\\s

匹配空格,类似: [ \t\r\n\f]

re{ n, m}

重复nm

\\S

匹配非空格,类似: [^ \t\r\n\f]

a|b

匹配 或者 b

\\w

匹配字母,数字,下划线,类似: [A-Za-z0-9_]

(re)

匹配 re,并捕获文本到自动命名的组里

\\W

匹配非字母,数字,下划线,类似: [^A-Za-z0-9_]

(?: re)

匹配 re,不捕获匹配的文本,也不给此分组分配组号

ruby?

匹配 "rub" 或 "ruby": y 是可选的

(?> re)

贪婪子表达式

ruby*

匹配 "rub" 加上 个或多个的 y

\\w

匹配字母或数字或下划线或汉字

ruby+

匹配 "rub" 加上 个或多个的 y

\\W

匹配任意不是字母,数字,下划线,汉字的字符

\\d{3}

刚好匹配 个数字。

\\s

匹配任意的空白符,相等于 [\t\n\r\f]

\\d{3,}

匹配 个或多个数字。

\\S

匹配任意不是空白符的字符

\\d{3,5}

匹配 个、个或 个数字。

\\d

匹配数字,类似 [0-9]

\\D\\d+

无分组: 重复 \d

\\D

匹配任意非数字的字符

(\\D\\d)+/

分组: 重复 \D\d 

\\G

当前搜索的开头

([Rr]uby(, )?)+

匹配 "Ruby""Ruby, ruby, ruby",等等

\\n

换行符

 

 

\\b

通常是单词分界位置,但如果在字符类里使用代表退格

 

 

\\B

匹配不是单词开头或结束的位置

 

 

\\t

制表符

 

 

\\Q

开始引号:\Q(a+b)*3\E 可匹配文本 "(a+b)*3"

 

 

\\E

结束引号:\Q(a+b)*3\E 可匹配文本 "(a+b)*3"

 

 

6、Scala的异常处理

Scala的异常处理跟java一样,要么throw要么try/catchThrow的用法一样,try/catch有点区别,catch里面要case各种Exception

try {
         val f = new FileReader("input.txt")
      } catch {
         case ex: FileNotFoundException => {
            println("Missing file exception")
         }
         case ex: IOException => {
            println("IO Exception")
         }
      } finally {
         println("Exiting finally...")
      }

7、ScalaI/O

object Test extends App {
   /**
    * Scala 进行文件写操作,直接用的都是 java中 的 I/O 类 (java.io.File)
    */
  val writer = new PrintWriter(new File("test.txt" ))
  writer.write("Scala")
  writer.close()
  //使用 Scala 的 Source 类及伴生对象来读取文件内容
  Source.fromFile("/home/sker/桌面/hbase.txt").foreach{print}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值