您的位置:首页 > 其它

Scala自学笔记

2017-11-26 19:04 141 查看
对于有其他语言基础的朋友来说,三天怼完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}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: