Scala学习——基础

来源:互联网 发布:类似营养师软件 编辑:程序博客网 时间:2024/05/23 17:12

一、常量和变量

常量定义使用关键字val   例如:val a:Int=2

变量定义使用关键字var   例如:var a:String="abc"

常量和变量的区别就是常量一旦赋值就值就不能再改变,而变量的值是可变的

由于在Spark大型系统中,有大量的网络传输,所以为了防止数据的错误更改,建议尽量使用val

变量定义时可以省略类型,scala会自动推导匹配类型

二、数据类型

Scala的数据类型统一都是类 

Scala的类型包括基本数据类型和加强版类型

Scala中的基本数据类型和Java中相同,但是所有类型的首字母必须大写

加强版类型例如StringOPS 、RichInt等等

三、操作符

大部分与Java中相同,只是Scala中没有++和--操作符

四、循环、控制

1、if表达式

Scala中if表达式是有返回值的,例如可以这样写:val isAdult = if (age > 18) 1 else 0

if表达式具有自动的类型推断,当if和else的类型不同时,表达式的返回类型是这两个类型的公共父类型。例如:if(age > 18) "adult" else 0, 此时ifelse的值分别是StringInt, 则表达式的值是Any, AnyStringInt的公共父类型


2、输入输出

读取控制台的输入可以使用read+数据类型,例如readInt、readString

输出使用和java中相同,print和println(println输出后换行),另外加一种printf,printf是一种格式化的输出方式,可以使用占位符例如%s,%d等,然后将变量传入

例如:printf("Hi, my name is %s, I'm %d years old.\n", "lilei", 18)


3、循环

Scala中具有和Java相同的循环结构,例如for循环、while循环、dowhile循环

Scala中的for:for(i<-表达式),把右边表达式中的值逐个赋给i

for(i<-0 to 10) 把0,1,2,3,.....,8,9,10逐个赋值给i

for(i<0 until 10)把0,1,2,3,....,8,9逐个赋值给i ,注意此处不包含10


这里有两个新概念,守卫式和推导式

守卫式:for循环中添加过滤条件if语句,即为守卫式

例如:for(i<- 0 to 10, j<- 0 to 9 if i > j)print((2*i+j) + "\t")

推导式:如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值

for(i<- 0 to 10)yield i%2 


多重for循环,基本与java中的思想一致,只是写法可以写成for(i<- 0 to 10, j<- 0 to 10)

五、函数

函数使用def定义def就是defunction的缩写,意为定义方法

注意 scala中的代码每行的最后不需要使用分号

def sum(n: Int) :Int= {
var sum = 0;
for(i <- 1 to n) sum += n
sum
}
 

分析上面的代码sum为定义的函数名,小括号中的n为参数n为Int类型,函数返回值为等号前面定义的Int  默认函数体最后一行是函数的返回值
如果函数不是递归函数的话 返回值类型可以省略不写。如果是递归函数,就得写返回值类型了
 scala中在定义函数的参数时,可以同时给出参数的默认值,当调用函数未给定参数值时,就会使用其默认值
例如:def sayHello(firstName: String, middleName: String = "Jim", lastName:
String = "Green") = firstName + " " + middleName + " " + lastName
 

参数不一定要是定长的,也可以是变长的参数
def sum2(nums: Int*): Int = {
if (nums.length == 0) 0
else nums.head + sum2(nums.tail:_*)

} 
Int*说明这个nums参数是一个类型为Int的变长参数
head是指这个可变长参数中的第一个参数值
tail是指除了第一个外的其他元素。_*是表示一个参数序列。这个方法就是实现一种递归求和。

六:数组
固定长度数组使用Array
不定长数组使用ArrayBuffer,ArrayBuffer无法直接使用,需要导入包scala.collection.mutable.ArrayBuffer
定义数组的两种方法:
val nums=new Array[Int](10)
val num2 =Array("a","b")
可以使用new 也可以不使用new 效果都是一样的

数组遍历
val array =ArrayBuffer[Int]()
array+=(1,3,5,9,7,2)
for(i<- 0 until array.length) print(array(i)+" ")

七、映射map
Scala映射就是键值对的集合Map。默认情况下,Scala中使用不可变的映射。
如果想使用可变集合Map,必须导入scala.collection.mutable.Map
 
val score=Map(“zhangsan”->60,"lisi"->80,"wangwu"->50)
或者
val score=Map((“zhangsan”,60),("lisi",80),("wangwu",50))
通过传入key的值可以获得对应的value值,例如score("zhangsan")

不可变map和可变map:
顾名思义,对不可变map做的任何更新删除操作,不改变原map。

遍历map
for ((key, value) <- score) println(key + " " + value) 
和Java中一样,Scala也有LinkedHashMap和SortedMap,特性也一样

八、元组Tuple
元组中的数据类型不一定都相同,元组定义时不需要指定数据类型,因为系统会自动判断数据类型
元组的索引值是从1开始,而不是0
取出元组中的值使用元组._索引值
Tuple拉链操作
Tuple拉链操作指的就是zip操作
zip是属于Array类的方法。zip操作会将两个数组以键值对的形式存入另外一个array,这个array中
的元素类型就是Tuple




0 0
原创粉丝点击