【Scala系列】Scala学习笔记(一)
1.官方文档
https://docs.scala-lang.org/
https://docs.scala-lang.org/tour/tour-of-scala.html
2.Hello World!
按照编程语言学习惯例,尝试一下scala的Hello World如何输出。
IDEA里安装scala插件之后,创建一个项目,New Project窗口选择Scala——sbt,分别选择sbt和scala的版本,我这里选择了sbt1.3.8和scala2.11.12。
上面步骤选择的版本对应project/build.properties里的sbt.version和build.sbt里的scalaVersion,最开始选择错误了也可以手动修改后重启idea。
项目创建成功后,IDEA底部Build会进行sbt和scala环境加载,没下载过的会进行下载(超级慢),已下载的直接使用。
等加载完成后,Project窗口展开src/main/scala,右击scala——New——Scala Class,
选择Object,输入org.whq.Hello,回车,创建了org.whq.Hello这个Object
在Hello文件中object Hello内部写main,就会出现按模板创建提示,回车后就出现了完整的main函数定义,在函数内部编写println("hello world!"),完成代码示例如下:
package org.whq
object Hello {
def main(args: Array[String]): Unit = {
println("hello world!")
}
}
单击main函数左侧的运行绿色箭头,运行main函数,即输出了hello world!
右击菜单里还会出现Scala REPL,进入命令模式,跟安装Scala后执行scala命令效果相同,在这里可以输入scala语句进行快速测试。
3.常量和变量
常量声明
val a="aaa"
等价于
val a:String="aaa"
等价于
val a:java.lang.String="aaa"
在String上Ctrl+B调到定义,看到Predef.scala中定义了type String = java.lang.String
变量
var b="bbb"
b="bbbb"
支持多个一起声明
val xmax, ymax = 100 // xmax, ymax都声明为100
声明元组
val p= (12,"haha")
4.数据类型
Byte 8位有符号补码整数。数值区间为 -128 到 127
Short 16位有符号补码整数。数值区间为 -32768 到 32767
Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754 标准的单精度浮点数
Double 64 位 IEEE 754 标准的双精度浮点数
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)的基类
5.字面量
整数
val a=1
长整数(Long)
val a=1L
双精度浮点数(Double)
val a=1.1
val a=1e5 //100000=1*10^5
单精度浮点数(Float)
val a=1.1f
布尔型
val a=true
val a=false
字符
'a' '\u0041' '\n'
字符串
"aaa"
val b="""aaa
bbb"""
三个双引号中间内容可以换行
Null值
空值是scala.Null类型。
Scala.Null和scala.Nothing是用统一的方式处理Scala面向对象类型系统的某些"边界情况"的特殊类型。
Null类是null引用对象的类型,它是每个引用类(继承自AnyRef的类)的子类。Null不兼容值类型。
Scala转义字符
\b \u0008 退格(BS) ,将当前位置移到前一列
\t \u0009 水平制表(HT) (跳到下一个TAB位置)
\n \u000a 换行(LF) ,将当前位置移到下一行开头
\f \u000c 换页(FF),将当前位置移到下页开头
\r \u000d 回车(CR) ,将当前位置移到本行开头
\" \u0022 代表一个双引号(")字符
\' \u0027 代表一个单引号(')字符
\\ \u005c 代表一个反斜线字符 '\'
6.运算符(操作符)
在Scala中,可以使用加(+)、减(-) 、乘(*) 、除(/) 、余数(%)等操作符,而且,这些操作符就是方法。例如,5 + 3和(5).+(3)是等价的,也就是说:
a 方法 b
a.方法(b)
上面这二者是等价的。前者是后者的简写形式,这里的+是方法名,是Int类中的一个方法。
例(命令中执行):
scala> val a=1+2
a: Int = 3
scala> val b=1.+(2)
b: Int = 3
scala中没有++和--,需要用+=1代替
var i=0
i: Int = 0
i+=1
println(i)
1
一个运算符是一个符号,用于告诉编译器来执行指定的数学运算和逻辑运算。
Scala 含有丰富的内置运算符,包括以下几种类型:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
算术运算符
下表列出了 Scala 支持的算术运算符。
假定变量 A 为 10,B 为 20:
运算符 |
描述 |
实例 |
+ |
加号 |
A + B 运算结果为 30 |
- |
减号 |
A - B 运算结果为 -10 |
* |
乘号 |
A * B 运算结果为 200 |
/ |
除号 |
B / A 运算结果为 2 |
% |
取余 |
B % A 运算结果为 0 |
关系运算符
下表列出了 Scala 支持的关系运算符。
假定变量 A 为 10,B 为 20:
运算符 |
描述 |
实例 |
== |
等于 |
(A == B) 运算结果为 false |
!= |
不等于 |
(A != B) 运算结果为 true |
> |
大于 |
(A > B) 运算结果为 false |
< |
小于 |
(A < B) 运算结果为 true |
>= |
大于等于 |
(A >= B) 运算结果为 false |
<= |
小于等于 |
(A <= B) 运算结果为 true |
逻辑运算符
下表列出了 Scala 支持的逻辑运算符。
假定变量 A 为 true,B 为 false:
运算符 |
描述 |
实例 |
&& |
逻辑与 |
(A && B) 运算结果为 false |
|| |
逻辑或 |
(A || B) 运算结果为 true |
! |
逻辑非 |
!(A && B) 运算结果为 true |
位运算符
位运算符用来对二进制位进行操作,~,&,|,^分别为取反,按位与,按位或,按位异或运算
<<左移,>>右移,>>>无符号右移
赋值运算符
以下列出了 Scala 语言支持的赋值运算符:
运算符 |
描述 |
实例 |
= |
简单的赋值运算,指定右边操作数赋值给左边的操作数。 |
C = A + B 将 A + B 的运算结果赋值给 C |
+= |
相加后再赋值,将左右两边的操作数相加后再赋值给左边的操作数。 |
C += A 相当于 C = C + A |
-= |
相减后再赋值,将左右两边的操作数相减后再赋值给左边的操作数。 |
C -= A 相当于 C = C - A |
*= |
相乘后再赋值,将左右两边的操作数相乘后再赋值给左边的操作数。 |
C *= A 相当于 C = C * A |
/= |
相除后再赋值,将左右两边的操作数相除后再赋值给左边的操作数。 |
C /= A 相当于 C = C / A |
%= |
求余后再赋值,将左右两边的操作数求余后再赋值给左边的操作数。 |
C %= A is equivalent to C = C % A |
<<= |
按位左移后再赋值 |
C <<= 2 相当于 C = C << 2 |
>>= |
按位右移后再赋值 |
C >>= 2 相当于 C = C >> 2 |
&= |
按位与运算后赋值 |
C &= 2 相当于 C = C & 2 |
^= |
按位异或运算符后再赋值 |
C ^= 2 相当于 C = C ^ 2 |
|= |
按位或运算后再赋值 |
C |= 2 相当于 C = C | 2 |
优先级
运算符优先级取决于所属的运算符组,它会影响算式的的计算。
实例:x = 7 + 3 * 2; 这里, x 计算结果为 13, 而不是 20,因为乘法(*) 高于加法(+), 所以它先计算 3*2 再加上 7。
查看以下表格,优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
类别 |
运算符 |
关联性 |
1 |
() [] |
左到右 |
2 |
! ~ |
右到左 |
3 |
* / % |
左到右 |
4 |
+ - |
左到右 |
5 |
>> >>> << |
左到右 |
6 |
> >= < <= |
左到右 |
7 |
== != |
左到右 |
8 |
& |
左到右 |
9 |
^ |
左到右 |
10 |
| |
左到右 |
11 |
&& |
左到右 |
12 |
|| |
左到右 |
13 |
= += -= *= /= %= >>= <<= &= ^= |= |
右到左 |
14 |
, |
左到右 |
7.Range
在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到5,这时就可以采用Range来实现。Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。
在创建Range时,需要给出区间的起点和终点以及步长(默认步长为1)。
创建一个从1到5的数值序列,包含区间终点5,步长为1
val a=1 to 5
a: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
创建一个从1到5的数值序列,不包含区间终点5,步长为1
val a=1 until 5
a: scala.collection.immutable.Range = Range(1, 2, 3, 4)
创建一个从1到10的数值序列,包含区间终点10,步长为2
scala> val a=1 to 10 by 2
a: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
创建一个Float类型的数值序列,从0.1f到10.0f,步长为2.2f
scala> val a=0.1f to 10.0f by 2.2f
a: scala.collection.immutable.NumericRange[Float] = NumericRange(0.1, 2.3, 4.5, 6.7, 8.9)
8.输出语句
不换行输出
print("my ")
print("code\n")
效果
my code
换行输出
println("hello")
println("world!")
效果
hello
world!
格式化输出
printf("插入%s数据,插入成功%d条,插入失败%d条","用户",3,1)
效果
插入用户数据,插入成功3条,插入失败1条
9.文件操作
输出到文件
scala终端中执行
import java.io.PrintWriter
val out = new PrintWriter("output.txt")
for (i <- 1 to 10) out.println(i)
out.close
执行后,在目录中会形成output.txt文件,内容为1到10
读取文件
import scala.io.Source
val inputFile = Source.fromFile("output.txt")
val lines = inputFile.getLines
for (line <- lines) println(line)
读取屏幕输入
val line = StdIn.readLine()
println("输入:"+line)