Scala快速学习教程(一)

    在学习spark时使用到了scala语言进行编程,特编写此博客,已尽量精简的方式对scala语言进行总结学习(在至少会一门编程语言的基础上看此篇博客会比较容易)。Scala运行于Java平台(JVM,Java 虚拟机)上,并兼容现有的Java程序,Scala代码可以调用Java方法,访问Java字段,继承Java类和实现Java接口。scala与java有许多相似之处,建议进行对比学习。本文编写默认读者已安装好scala编程环境,若未安装可访问scala安装。本文参考子雨大数据之spark入门教程精简整理而成,可访问该网址获得更多内容。


基本数据类型及变量的声明和操作符

Scala的数据类型包括:Byte、Char、Short、Int、Long、Float、Double和Boolean。对于字符串,Scala用java.lang.String类来表示字符串。

Scala有两种类型的变量,一种是val,是不可变的,在声明时就必须被初始化,而且初始化以后就不能再赋值;另一种是var,是可变的,声明的时候需要进行初始化,初始化以后还可以再次对其赋值。

scala> val a = 5
a: Int = 5

需要注意的是,尽管我们在第1行代码的声明中,没有给出变量类型,但是,Scala具有“类型推断”能力,可以自动推断出变量的类型。如对于整数自动腿短为Int,浮点数自动推断为Double,读者可自行编写代码进行实验。若想将整数指定为Short类型,可进行显示声明。

scala> val b : Short = 5
b: Short = 5

对val变量再次赋值会报错,如果一些变量,需要在初始化以后还要不断修改它的值,则需要声明为var变量。

Scala支持加(+)、减(-) 、乘(*) 、除(/) 、余数(%)等算数运算操作符和大于(>)、小于(<)、大于等于(>=)和小于等于(<=)的逻辑运算操作符。

注意:与java不同,Scala中未提供++和--,只能使用+=1或-=1来递增或递减

scala> var i = 5;
i: Int = 5
scala> i += 1  //将i递增
scala> println(i)
6

Range

在执行for循环时经常需要指定循环范围,在Scala中采用Range实现,创建Range时需要给出区间的起点和终点以及步长(默认步长为1)。

scala> 1 to 10  //包含区间终点
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> 1 until 10  //不包含区间终点
res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> 1 to 10 by 2  //指定步长为2
res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)

scala> 'a' to 'c'
res3: collection.immutable.NumericRange.Inclusive[Char] = NumericRange(a, b, c)

另外可以使用Range创建列表,数组和集合等。

scala> val x = (1 to 10).toList
x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> val x = (1 to 10).toArray
x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> val x = (1 to 10).toSet
x: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)

下面给出一个for循环使用Range的简单例子,在控制结构处再详细讲解for循环

scala> for (i <- 1 to 3) println(i)
1
2
3

输出语句

print()不换行,println()换行

此外还带有C语言风格的格式化字符串的printf函数

printf("My name is %s. I hava %d apples and %d eggs.\n","Ziyu",2,3)

 控制结构

if语句与java相同,有一点不同的是,Scala中的if表达式的值可以赋值给变量

val a = if (x>0) 1 else -1

与java相同的while,do-while

在上面讲解Range时给出了一个for循环的小例子。在java中通常使用for( ; ; )来表达循环条件例如:

for(int i=1;i<=5;i+=2) System.out.println(i);

等价于Scala中

for(i <- 1 to 5 by 2) println(i)

当希望过滤出满足条件的结果时,可使用守卫表达式,在后面添加if开头的Boolean表达式

for (i <- 1 to 5 if i%2==0) println(i)

Scala支持多个生成器情形,用分号隔开,相当于两个for循环嵌套,每个生成器可带一个守卫表达式,如

for (i <- 1 to 5 if i%2==0; j <- 1 to 3 if j!=i) println(i*j)

for推导式:使用yield关键字对过滤结果构建集合,用于后续其他处理。函数式编程思想,关心数据映射,一种东西和另一种东西之间的对应关系。

scala> for (i <- 1 to 5 if i%2==0) yield i
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值