前言
今天开始正式系统的学习Scala,记录博主的学习过程、解决遇到的问题。
参考数书籍:
《Scala编程》-第3版
Scala-2.12.8
安装使用:
Linux下安装可参考:https://blog.csdn.net/qq_38038143/article/details/88670650
Windows下安装可参考:http://www.runoob.com/scala/scala-install.html
安装包下载(包括windows和linux):
链接:https://pan.baidu.com/s/19yTh2RuC9_3aiNS1oaHz5g
提取码:4m0r
代码可以在GitHub中找到:
https://github.com/GYT0313/Scala-Learning
博主的所有操作都在Windows上进行,短语句使用scala编译器,长语句使用Sublime。
1. 第一节
- 使用CMD在窗口执行scala:
- 定义变量
有两种方式:
- val 不可变
- var 可变
显示指定变量的类型:
不指定类型,Scala自动推断变量类型(类型推断):
内容太长,换行输入,直接会车,会在下一行提示 | :
- 定义函数
max 函数用于比较两个数的大小。() 中指定了参数和类型,(): Int 表示函数的返回值为Int 类型:
当然,不指定函数的返回类型,Scala会自动推断,简写:
另外,有些函数没有返回值可以指定为Unit 类型(相当于Java中的void),但是更加推荐第二种:
- 编写脚本
hello.scala 代码如下:
通过 args 获取命令行参数
println("Hello, " + args(0) + "!")
CMD中执行:
使用scala 直接运行.scala,代表这个文件是一个脚本,而scala应用程序需要先编译再运行(下一节会展示如何编译运行一个scala程序)
5. 使用while
printargs.scala
var i = 0
while (i < args.length) {
println(args(i))
i += 1
}
这样的代码符合Java 的风格,但Scala有更简单的方法。
- foreach 和 for 遍历
pa.scala
foreach()中传入的称为函数字面量
args.foreach(arg => println(arg))
这里,Scala会推断arg 的类型,如果要显示的指出类型,你应该这样写:
args.foreach((arg: String) => println(arg))
另外,如果函数字面量是一个只接收单个参数的语句,你还可以这样写:
args.foreach(println)
如果不适用foreach函数,可以使用for 表达式,上述代码可以这样写:
for (arg <- args)
println(arg)
2. 第二节
-
用类型参数化数组
Scala 中可以使用new 来实例化对象或类的实例。
实例化一个数组:
可以看到与Java不同,Scala的类型是写在[ ] 中。另外,你可以发现arrayString的类型为val,代表这个变量是不可变的。但是他指向的那个数组对象是可以改变的(即数组的赋值)。
打印:
其中 0 to 1会被转化为 (0).to(1),返回一个0,1 的序列。另外,在Scala 中 1 + 2,实际上执行的是 (1).+(2) ,+ 是Int 类型的一个方法(其他如 - * 等同理),比如:
除此之外,Array 数组中对其访问时调用apply() 方法,对其赋值时调用update() 方法,如:
初始化语句还可以这样写:
-
使用列表
Scala 中的列表是不可变的,元素必须是同种类型。
下面介绍列表的常用方法:因为列表不可变,所以下面返回的都是新的列表
::: 拼接列表:
:: 向头部添加元素(右操作元,比如 1+2 == (1).+(2) 为左操作元):
Nil 为空列表(等于 List()):
另一种创建列表的方式:
对长度为4的元素计数:
去掉头2个元素:
去掉后2个元素:
是否含有 “until”:
返回长度为4的元素:
过滤掉长度为4的元素:
遍历每个元素:
返回首个元素:
返回除了最后一个元素之外的元素:
是否为空:
返回最后一个元素:
返回元素个数:
对每个元素添加 “y”:
按一定规则返回所有元素:
反转:
按首字母小写排序:
返回除首个元素外的所有元素:
-
使用元组
元组也是不可变的,但它可以存储不同类型的数据。
其中,_1 和 _ 2代表的是字段,即对应元素的字段 -
使用集(set) 和 映射(map)
Set 有可变和不可变类型,默认为不可变。
调用可变的Set:
不可变映射:
可变映射:
-
从文件读取文本行
打印每行的字符数和内容:
import scala.io.Source
// 获得每行的字符数的长度,如12返回2
def widthOfLength(s: String) = s.length.toString.length
if (args.length > 0) {
// 读取内容,并转换为列表
val lines = Source.fromFile(args(0)).getLines().toList
// 获取最大的字符数
val longestLine = lines.reduceLeft(
(a, b) => if (a.length > b.length) a else b
)
// 获取大字符数的位数
val maxWidth = widthOfLength(longestLine)
// 打印
for (line <- lines) {
// 计算需要的空格数
val numSpace = maxWidth - widthOfLength(line)
val padding = " " * numSpace
println(padding + line.length + " | " + line)
}
}
else
Console.err.println("Please enter filename")
运行(注:运行时需要把中午注释删除,因为中文与字母所占字节不同):