Scala基础-01-Scala环境安装及基础语法(变量,函数)
Scala简介
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。Scala是编写大数据框架Spark的语言,随着大数据的兴起,越来越多的人开始学习Scala
Scala语言的优点
优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多。
能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
Scala环境安装
1.安装JDK
Scala是运行在Java虚拟机JVM上的一种编程语言,所以安装Scala编译器前要先安装JDK
2.安装Scala编译器
打开Scala官网,进入Download页面
由于现有的Spark项目一般都用的比较成熟的Scala2.10.x版本,所以为了方便日后学习Spark,我选择了下载较老的2.10版本,在Other Releases中选择2.10版
Windows用户可以选择.msi后缀的文件来安装Scala,可以一键安装不用自己手动配置环境变量
IDEA安装Scala插件
安装完Scala编译器后还需要给IDE安装对应的插件才能使用Scala,我是用的IDE是IDEA
打开IDEA插件页,File->Setting->Plugins,搜索Scala,下载安装,如果速度太慢,也可以自己去Jetbrains插件官网下载然后采用本地安装
Jetbrains官网的Scala插件版本
红圈中选项进行本地安装
一.Scala变量
Scala是强类型语言,和Java一样,有7种数值类型Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型
Scala变量的定义
Scala编译器会自动推断变量的类型(和Python一样),也可以指定类型
有两种方法定义变量,val和var,val定义的变量是不可变的,相当于java中的final修饰(比java简洁太多),var定义的变量是可变的,使用中尽可能多使用val定义变量
object VariableDemo {
def main(args: Array[String]) {
//定义常量
val i = 1
//定义变量
var s = "hello"
//自己指定变量类型,不指定Scala编译器会自动推断变量的类型
val str: String = "itcast"
}
}
二.Scala表达式
Java中的各种控制语句在Scala中都简化为表达式,包括条件表达式,循环表达式等。Scala表达式都有返回值,scala中有个Unit类,写做(),相当于Java中的void
2.1 条件表达式
Scala条件表达式的一般形式:
//如果x>A,则将A赋值给a变量,否则将B赋值给a变量
val a = if (x > A) A else B
条件表达式的其他使用示例:
object ConditionDemo {
def main(args: Array[String]) {
val x = 1
//判断x的值,将结果赋给y
val y = if (x > 0) 1 else -1
println(y)
//支持混合类型表达式,即可以返回不同类型的变量值
val z = if (x > 1) 1 else "error"
println(z)
//缺省else,相当于if (x > 2) 1 else ()
val m = if (x > 2) 1
println(m)
//执行结果和上式一样
val n = if (x > 2) 1 else ()
println(n)
//if和else if
val k = if (x < 0) 0
else if (x >= 1) 1 else -1
println(k)
}
}
2.2 块表达式
在Scala中使用{ }来构成一个块表达式,块表达式中可包含数量不等的表达式,块的值是块中最后一个表达式的值,块表达式示例:
def main(args: Array[String]) {
val x = 0
//将块表达式的值赋给result
val result = {
if (x < 0){
-1
} else if(x >= 1) {
1
} else {
"error"
}
}
print(result)
}
2.3 循环语句
Scala中可以用while和for两种方式实现循环,但大多场景会用更灵活的for循环
2.3.1 普通for循环
for循环的格式:
A表示被遍历的对象,可以是表达式,数组或集合
for (i <- A)
//for循环中的执行语句需要比for表达式退一个tab(和Python一样)
print(i)
object ForDemo {
def main(args: Array[String]) {
//被遍历体是表达式
//表达式1 to 10表示一个Range(区间),用来产生随机数
for (i <- 1 to 10)
println(i)
//被遍历体是数组
val arr = Array("a", "b", "c")
for (i <- arr)
println(i)
}
}
2.3.2 高级for循环
for循环表达式可以很复杂,被循环体可以是一个生成器,生成器可以带一个条件
object ForDemo {
def main(args: Array[String]) {
//注意:if前面没有分号
for(i <- 1 to 3; j <- 1 to 3 if i != j)
print((10 * i + j) + " ")
}
}
2.3.3 for推导式
如果for循环的循环体以yield开始,则该循环会构建出一个集合
object ForDemo {
def main(args: Array[String]) {
//每次迭代生成集合中的一个值
val v = for (i <- 1 to 10) yield i * 10
println(v)
}
}
三.Scala中的方法和函数
3.1 Scala方法
3.1.1 方法的定义
下式从左到右各部分含义分别为:使用def关键字定义方法,方法名称为method1,参数为x,y,均为Int类型,方法返回值为Int型,方法的方法体为x*y
def method1(x: Int, y: Int) : Int = x*y
3.1.2 方法的返回值
方法的返回值类型可以不写,编译器可以自动推断出来,但是递归函数必须指定返回类型
3.1.3 方法在Scala中的应用
Scala中的操作符本质都是一个方法,如+ - * / % & | ^ >> <<
等操作符,底层都是用方法实现的
如a + b
是a.+(b)
的简写,a + b
本质上是a调用了一个名称为“+”的方法,方法参数为b
所以,a.方法(b)
可以简写成 a 方法 b
3.2 Scala函数
3.2.1 函数的定义
定义名称为function1的函数,返回值为val类型变量,参数为x,y,均为Int类型,方法的方法体为x*y
val function1 = (x: Int, y: Int) => x*y
3.3 Scala方法和函数的相互转化
将方法转化为函数:
//只需要在方法名后加下划线“_”
val funtion1 = methon1 _