各种平台下scala: http://www.scala-lang.org/download/
这里用windows平台下:
windows: scala 2.12.1: http://downloads.lightbend.com/scala/2.12.1/scala-2.12.1.zip
java环境 JDK1.8:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html (我比较喜欢免安装版的,自己网上找找吧)
1. 右击我的电脑-> 点击”属性”->点击“高级系统设置”
2. 点击“环境变量”
在系统变量中 添加 JAVA_HOME=”D:\JAVA\JDK”
在PATH中新建 %JAVA_HOME%\bin
在系统变量中 添加 SCALA_HOME = “G:\bigdatas\scala-2.12.1”
在PATH中新建 %SCALA_HOME%\bin
ps:这里的添加的地址都是你所安装jdk scala的本地磁盘地址
3. 运行测试 判断是否安装成功
IDE工具用的是IDEA的社区版本,下载地址:
http://www.jetbrains.com/idea/download/download-thanks.html?code=IIC
新建一个scala.class ,注意kind选择object,因为scala需要一个main入口
常用数据类型:
数值型:Byte,Char,Short,Int,Long,Float和Double
Boolean类型: Boolean
与java不同的是,这些在 scala中都是类,并 不区分基本类型和引用类型
声明变量和值
声明常量 val,即不可改变,类似于java 中的final
声明变量 var,即可改变
与java不同的是,scala可以不用指定类型,因为scala可以推断出来是什么类型,而java就必须先声明
val x = 0
var y = 1
y = 2
// 给常量赋值会出现编译错误
// x = 3
// 显式指定变量类型
val x1: Int = 0
var y1: Int = 0
定义变量时没有指定变量类型。这是否意味着 Scala 是和 Python 或者 Ruby 一样的动态类型语言呢?恰恰相反,Scala 是严格意义上的静态类型语言,由于其采用了先进的类型推断(Type Inference)技术,程序员不需要在写程序时显式指定类型,编译器会根据上下文推断出类型信息。比如变量 x被赋值为 0,0 是一个整型,所以 x的类型被推断出为整型。当然,Scala 语言也允许显示指定类型,如变量 x1,y1的定义。一般情况下,我们应尽量使用 Scala 提供的类型推断系统使代码看上去更加简洁。
运算符
算术运算符 + , - , *, / , %
关系运算符 == , !=, > ,<, >= , <=
逻辑运算符 &&, || , !
赋值运算符 = ,+= ,-= , *= , /= , %= , <<=, >>=, &= , ^=, |=
if条件表达式
if/else语法结构和java一样,不过在scala中if/esle表达式有值,这个值就是if或else中最后一行语句返回的值。例如
object Test02 {
def main(args: Array[String]): Unit = {
val age=10
println(if(age>12)true else false)
}
//result : false
也可将if表达式赋予一个变量,例如:
object Test02 {
def main(args: Array[String]): Unit = {
val age=20
val isadult = if (age>10) true else false
println(isadult)
}
}
//result: true
还可以这么写:
object Test02 {
def main(args: Array[String]): Unit = {
val age=20
var isadult=false
if(age>10) isadult=true else isadult=false
println(isadult)
}
}
//result: true
if表达式的类型推断: scala中每个表达式都有一个类型,而if和else的值类型可能不同,此时会自动推断,取公共父类型。例如:
object Test02 {
def main(args: Array[String]): Unit = {
val age=20
println(if(age>10) "adult" else 0)
}
}
这里if返回值是String类型,else返回值是Int类型,则表达式返回类型是Any,Any是String与Int的公共父类型(依据下图可知)。
如果else部分缺失,则默认else的值为Unit,也用()表示
scala类型图:
语句终止,块表达式
通常scala不需要语句终结符,默认将每一行作为一个语句。如果在单行写多个语句,则需要以分号符隔开,例如:
var a,b,c=10;if(a>5){b=b+1;c=c+1} ;printf("%d,%d,%d",a,b,c)
//result 10,11 ,11
块表达式:
块表达式指的就是{ }中的语句序列,可以包含多条语句,最后一个语句的值就是表达式的返回值,例如:
var a,b,c=10
val res = if(a>5){ //res 为if语句最后一行返回值a+b+c
a+=1
b+=1
a+b+c
}
println(res)
}
//result: 32
循环:
scala拥有和java一样的while循环,没有for(初始化变量;边界条件;更新变量)循环,如果是这样的循环,则可以使用while循环或for语句实现(这个for语句与java中的for语句时有差别的,使用了一个类似R中的提取符号<-)
while循环:
var a=5
while (a>0){
a=a-1 //注意 scala中并没有像java中的a-- 或者a++操作
print(a+" ")
}
//result:4 3 2 1 0
do-while循环
var a = 5
do {
a = a - 1
print(a + " ")
} while (a > 0)
//result:4 3 2 1 0
while循环显示做判断,再执行代码块,而do-while是先执行代码块,再进行判断。
如何跳出循环:
1.使用Boolean类型变量
2.使用return发挥
3.使用Breaks对象中的break方法
Boolean跳出循环:
var flag=true
var a=5
while(flag){
a=a-1
println(a)
if(a==2) {
flag = false
}
}
return跳出循环:
for (i<-1 to 10){
println(i)
if(i==5) return
}
有点类似java中的
public void f(){
return;
}
break跳出循环:
import scala.util.control.Breaks._
/**
....
*/
breakable {
for (i <- 1 to 10) {
println(i)
if (i == 5) break()
}
}
这个break不太习惯,没java好用
简单for语句:
for(i<- 0 to 5) print(i+" ")
像不像在与机器说话一样:提取(<-)0到5(0 to 5)之间的数 并且打印(print)
until语句:
不包含上界
for (i<- 1 until(5)) print(i+" ")
//result: 1 2 3 4
if守卫(即输出带if的bool类型的判断语句,满足某种条件输出)
for (i<- 1 to 20 if(i%2==0)) print(i+" ")//打印出1到20之间能被2整除的数字
//result:2 4 6 8 10 12 14 16 18 20
for生成集合
print(for (i<- 1 to 10) yield(i))
//result:Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)