Scala学习总结(from scala for the Impatient)

范修伟
2023-12-01

2018/05/14更:Scala特质 Trait。

这本书很适合初学者,如果有需要可以留下邮箱,或者私信,我发电子版给你们!

基础语法(1):

scala shell 环境退出:  :quit语句

=> 符号作用类似于Python 匿名函数lambda;

val a = 'b'  a:Char b 字符型数据   val test = "a" type:字符串 所以,Scala用单引号和双引号出来的数据类型是不同的,并且

val a = 'bb'会报错                        

test.trim 删除字符串前后空白符

a.toUpperCase大写转换,a.toLowCase,小写转换,a.toString,字符串转换,通过tab键,可以查看当前变量能够使用的方法;带不带括号是一样的,内置方法;

val:不可变变量,可认为不可变,例如 val a =1,再定义 a=2;即报错,val a =2可以,这是重新定义变量;

var:可变变量,例如val a =1, 再输入 a=2;也是可以通过编译的,这是两者区别。

并且val是被孤立使用的,因为用var之后,你无法预知后面的结果,可能在中途你对其进行了改变却忽略了这个过程;

如果在定义变量时,需要强调类型,可以使用 val a: Int = 1;类似这种方法;

在迭代计算的时候,记住用var 定义变量,否则无法编译通过,因为val定义值是不变的;

List是列表,Buffer是可变列表;Iterable[Int](1,2) 也会生成一个List(1,2);Iterable 是一个迭代类型

基础语法(2):

a+b  的简写   a.+(b)其实不直观!

import scala.math._ 导入数学运算包,_代表一个通配符,类似于JAVA 的*;

在Scala中,方法不含有参数时,不用(),含有参数时,需要(),例如:"Hello".distinct去重,而 count方法,需要();

在Scala中常用的{},里面包括的多重表达式是代表一个模块,其中结果是最后一个表达式的结果!特别注意

在定义完值、变量、函数之后,最后在后面加上你需要返回值的类型;否则你也不能确定它返回什么结果,对你下一步工作造成影响

Scala 循环:Scala 没有Break 和Continue 来控制循环,你可以通过布尔量打破循环或者返回中间量,或者利用Control.Break来打破训练,但这种方法是利用捕获异常实现,会消耗大量时间!

yield生成器:这个同Python 一样,实现迭代;在Python中类似于容器,装有一系列元素,通过.next按序捕获元素;

3:Scala 函数:

Scala 函数初接触会有点陌生,例如:

def fac(n:Int){

var r =1; for (i<- 1 to n) 

r = r*i 

r} 该函数返回的结果是一个Unit,一个单元;如果你{}前面加“=”号,才是返回值,特别注意!

def fac(n:Int) :Int={                #定义返回值类型,返回值是r,类型是Int,并且,Scala不建议使用Return!

var r =1; for (i<- 1 to n) 

r = r*i 

r} 

scala Process 捕获异常,这个问题我还没搞清楚;之后补充,我要去跟我师姐讨论一下;

3、Scala Array基础知识

定义Array: val nums = new Array[Int](10) ;new生成新对象,一维矩阵,Array内置函数,[Int]代表矩阵元素类型;(10)矩阵长度;可以通过Array.length 观察矩阵的列数(长度),Array()通过索引选择元素,索引不能超过最大长度且索引计数从0开始;Array长度是不可变的。

ArrayBuffer长度可变,但是需要通过import scala.collection.mutable.ArrayBuffer导入,且动态数组可以用.append增加元素,静态是不可以的

val arrbuff += ArrayBuffer 通过+号可以增加元素,对变长数组而言!数组的操作语句如下:

insert(a,b);a表示索引位置,b表示元素值;与Python相似;且b可以是几个元素,如a.insert(2,7,8,9);表示在索引2的位置,连续插入三个元素;

remove,移除元素,例如a.remove(2)==a.remove(2,1)移除矩阵中索引2位置开始的第一个元素,第二个参数其实是移除的元素数量,不写就表示是1;请知晓

reverse() 倒转,例如val a = Array(1,2,3,4)  a.reverse 之后的结果:Array(4,3,2,1)

sum:a.sum 矩阵求和运算,对元素进行求和,要求元素是数值类型;比如a.sum(前面的矩阵) 结果是10;

max,min函数:内置最值方法,可以用于计算字符型数组;数值型是最大最小值,字符型的话按字母大小选择,如果相同位置字母相同,依次往后比较;

sorted:矩阵排序,需要元素类型一致,全是字符型或者全是数值型,否则报错:no implicit ordering defined by Any.

mkString 将数组转换成字符串,且可以在间隔位置插入某个字符元素:

import util.Sorting.quickSort   val a =Array(1,2,3,5) val result = a.mkSorting("b")

result = String:1b2b3b5b字符串类型

3.1 多维数组:

多维数组定义 val matrix = Array.ofDim[数据类型](3,4),矩阵维度;

赋值:matrix(row)(column) = num 对其进行赋值;

另一种第一方法  val matrix = new Array[Array[Int]](num);其实就是数组里面元素是数组;

赋值:matrix(i) = new Array[Int](num) 赋值给matrix 第i个位置一个数组,如果需要对数组元素进行赋值的话;则是:

matrix(i)(j);j代表数组中数组的第j个位置

4:Map and tuple:映射和元祖;映射与Python字典类似;定义过程

import scala.collection.mutable.Map  val a = Map("a"->1;"b"->2);可认为前者就是键,通过键找到值,a("b")返回1;

对于Map,类似于Python的字典,有键和值,可以做循环;

Tuple:

Scala 元祖建立直接用()即可val a =(1,2,3),元祖不能改变,同Python,切记:取元祖元素方法是a._1类似;元祖索引从1开始

Scala Object:由于Scala没有static方法,即用Object构造;

object Accounts {
private var lastNumber = 0
def newUniqueNumber() = { lastNumber += 1; lastNumber }

} 如果你需要生成一个新的lastNumber,可以直接调用Accounts.lastNumber实现自加功能;

5 Scala 重载:overridding method

Scala 中抽象类(Abstract方法不能被重载);重载方法需要用关键词override注明;

检验某个方法是否属于该类,可以通过isInstanceOf方法;

6 Scala 文件读取与正则

文件读取:import scala.io.Source  val source = Source.fromFile("Myfile.txt","UTF-8") //第二个参数是编码

val lineIterator = source.getLines //获取文件行;一个迭代器

for (l<- lineIterator) process //循环处理每行

val lines = source.getLine.toArray //将行转换成数组;

val contents = source.mkString //将整个文件内容转成字符串

文件书写:

PrintWrite

正则表达:

感觉正则表达还是很重要的,在哪里都用得到,测试脚本、爬虫、前端、数据清洗等等,有兴趣的可以参考我另外一篇博文;内容大多来自于《Re正则必知必会》,这本书挺好的!

Scala 正则通过 import scala.util.matching.Regex 导入,Python是import re

example: val num = "[0-9]+".r 匹配开头是0-9中的任意一个数字的字符串。

num.findAllIn("contents")和num.findFirstIn("contnets")区别:通过编译之后,findAllIn会找到内容中所有匹配的选项,而firdt只需要找到一条记录;

scala slice:函数,字符串切片,a.slice(2,4),=,包含索引为2的位置元素和3的位置元素,不含有位置4

Scala trait:是代码复用的基础,可以用来封装方法和字段,然后再重用它们,但是特质定义不接受参数,否则报错。例如:

trait test_demo{
def test{
print("this is a demo")
  }
}
class Frog extends test_demo{
 override  def toString="test"
}
frog = new Frog
frog.test
"this is a demo"

特质Trait通过用extends 继承,如果又要继承类,又要继承Trait,可以利用 extends class with trait with trait 

补充:Scala 没有枚举类型,但是可以通过extends Enumeration继承枚举方法;Spark中RDD弹性分布式数据集是只读的;所以你需要添加数据时,需要采用Union 或者Union all;前者会过滤两条相同记录;后者不会,与SQL的是相同的。

 类似资料: