对于有其他语言基础的朋友来说,三天怼完Scala并不是什么难事;如果没有其他语言基础的话,可能要花很多时间来理解里面的一些东西,看这篇博客的意义并不大,推荐去菜鸟教程看更加详细的scala教程。此外,个人建议,不要选择scala或者python这类语言作为入门的语言,入门语言个人首推java(不喜勿喷),当然也可以选择C或者其他。
git传送门:https://github.com/ZzzzZzreal/ScalaDemo
一、Scala的特性
1.面向对象特性
Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。
类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。
2.函数式编程
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case 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 | 32位IEEE754单精度浮点数 |
Double | 64位IEEE754单精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
Null | null 或空引用 |
Nothing | Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。 |
Any | Any是所有其他类的超类 |
AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
上表中列出的数据类型都是对象,也就是说Scala没有java中的原生类型。在Scala是可以对数字等基础类型调用方法的。
☆空值是 Scala.Null 类型。
☆Scala.Null和Scala.Nothing是用统一的方式处理Scala面向对象类型系统的某些"边界情况"的特殊类型。
☆Null类是null引用对象的类型,它是每个引用类(继承自AnyRef的类)的子类。Null不兼容值类型。
2、Scala的变量
val 声明常量(相当于java的final) 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} | 重复n到m次 | \\S | 匹配非空格,类似: [^ \t\r\n\f] | |
a|b | 匹配 a 或者 b | \\w | 匹配字母,数字,下划线,类似: [A-Za-z0-9_] | |
(re) | 匹配 re,并捕获文本到自动命名的组里 | \\W | 匹配非字母,数字,下划线,类似: [^A-Za-z0-9_] | |
(?: re) | 匹配 re,不捕获匹配的文本,也不给此分组分配组号 | ruby? | 匹配 "rub" 或 "ruby": y 是可选的 | |
(?> re) | 贪婪子表达式 | ruby* | 匹配 "rub" 加上 0 个或多个的 y。 | |
\\w | 匹配字母或数字或下划线或汉字 | ruby+ | 匹配 "rub" 加上 1 个或多个的 y。 | |
\\W | 匹配任意不是字母,数字,下划线,汉字的字符 | \\d{3} | 刚好匹配 3 个数字。 | |
\\s | 匹配任意的空白符,相等于 [\t\n\r\f] | \\d{3,} | 匹配 3 个或多个数字。 | |
\\S | 匹配任意不是空白符的字符 | \\d{3,5} | 匹配 3 个、4 个或 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/catch。Throw的用法一样,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、Scala的I/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}
}