(菜鸟的第一次博客尝试)
一:scala语言基础
*)scala简介
1)多范式编程语言
面向对象编程+面向函数式编程
2)编程简单
Java vs Scala编程语言
代码量:10:1
3)scala语言诞生了两个大数据框架,而且非常重要的大数据框架
- spark
分布式海量数据处理框架
- kafka
分布式流平台,基于消息的发布订阅队列框架,存储数据
3)学习网站
https://www.scala-lang.org
- 官网
http://twitter.github.io/scala_school/zh_cn/
- 推特
4)版本的选择
2.11.x版本, 此处为2.11.12
备注说明:
- Spark 1.6.x版本 推荐的scala 2.10.x版本
- Spark 2.x版本 推荐的Scala 2.11.x版本
*)scala的安装
1)windows平台
*)JDK 8
*)以scala-2.11.12.zip为例
1:解压缩:D:\developer\scala-2.11.12
2:设置SCALA_HOME:D:\developer\scala-2.11.12
3:将%SCALA_HOME%\bin加入到PATH路径
4:执行:scala -version
2)linux平台
*)JDK 8
*)跟安装JDK步骤相同
*)写一个scala程序
1)scala语言是基于JVM之上的语言
*.java
编译 *.class -> JVM
*.scala
编译 *.class -> JVM
#创建scala文件
vi HelloScala.scala
#编写scala程序
object HelloScala {
def main(args: Array[String]): Unit = {
println("Hello World !!!")
}
}
#编译scala代码
scalac HelloScala.scala
#执行scala程序
scala HelloScala
*)常用开发工具
1)REPL(Read Evaluate Print Loop):命令行
2)IDE:图形开发工具
The Scala IDE (Based on Eclipse):http://scala-ide.org/
IntelliJ IDEA with Scala plugin:http://www.jetbrains.com/idea/download/
Netbeans IDE with the Scala plugin
*)scala数据类型
1)在scala中,任何数据都是对象
举例:数字1 -》是一个对象,就有方法
scala> 1.toString
res0: String = 1
scala> 1
res1: Int = 1
scala> "1".toInt
res2: Int = 1
2)数据类型:复习
Byte: 8位的有符号 -128~127
Short: 16位的有符号的 -32768~32767
Int: 32位的有符号的
Long: 64位的有符号的
Float: 浮点型
Double: 双精度
3)var声明变量,variable 简写,表示的变量,可以改变值
scala> var b:Byte = 116
b: Byte = 116
#如果不声明变量类型,则根据变量值进行自动推导
scala> var b = 116
b: Int = 116
scala> b = 120
b: Int = 120
scala> b = "abc"
<console>:12: error: type mismatch;
found : String("abc")
required: Int
b = "abc"
^
4)val声明变量, value 简写,表示的意思为值,不可变
scala> val c: Int = 12
c: Int = 12
scala> c = 13
<console>:12: error: reassignment to val
c = 13
^
5)对于字符串来说,在scala中可以进行插值操作
scala> var str = "Hello ${name}"
str: String = Hello ${name}
scala> var str = s"Hello ${name}"
str: String = Hello Tom
6)lazy 使用
scala> lazy val i = 10
i: Int = <lazy>
scala> i
res3: Int = 10
举例:读取文件(文件不存在的话)
scala> val words = scala.io.Source.fromfile("d:\\aa.txt").mkString
<console>:11: error: value fromfile is not a member of object scala.io.Source
val words = scala.io.Source.fromfile("d:\\aa.txt").mkString
^
scala> val words = scala.io.Source.fromFile("d:\\aa.txt").mkString
java.io.FileNotFoundException: d:\aa.txt (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:131)
at scala.io.Source$.fromFile(Source.scala:91)
at scala.io.Source$.fromFile(Source.scala:76)
at scala.io.Source$.fromFile(Source.scala:54)
... 32 elided
scala> lazy val words = scala.io.Source.fromFile("d:\\aa.txt").mkString
words: String = <lazy>
7)在scala中操作符就是方法
scala> 1.+(2)
res3: Int = 3
在scala中不支持三种操作符
++ / --/ ?:
自增 自减 三目
scala中的操作符实际上就是scala中方法的调用,只不过为了简洁期间,将方法的调用转换为中缀表达式
Scala中操作符实际上是方法。例如:
a + b
是如下方法调用的简写:
a+(b)
a 方法 b可以写成 a.方法(b)
8)给变量赋值
scala> var a = _
<console>:11: error: unbound placeholder parameter
var a = _
^
scala> var a:String = _
a: String = null
scala> var b:Int = _
b: Int = 0
scala> var b:Double = _
b: Double = 0.0
#如果使用默认值的话,一定指明变量的类型,否则报错
String类型的默认值是null
Int类型的默认值是0
Double类型的默认值是0.0
9)Nothing表示在程序运行中产生了Exception
scala> def f = throw new Exception("Someing")
f: Nothing
如果返回值是Nothing,表示返回了异常
注意:在Scala中,定义变量可以不指定类型,因为Scala会进行类型的自动推导
*)scala的条件表达式
IF 判断来说有三种结构:
-1, IF
IF(boolean) {
}
-2, IF...ELSE...
IF(boolean) {
//TODO true do something
}
ELSE {
//TODO false do something
}
-3,IF...ELSE IF...ELSE
IF(i==1) {
//TODO true 1 something
}
ELSE IF(i==2){
//TODO false 2 something
}
ELSE {
//TODO false 0 something
}
def main(args: Array[String]): Unit = {
}
#Unit表示无返回值,相当于Java中的void
块表达式
在scala中{}中课包含一系列表达式,块中最后一个表达式的值就是块的值
*)scala的循环
For 循环
循环表达式
在JAVA中进行循环的时候
for(int i = 0; i< 10; i++)
While 循环表达式
while loop
先判断再执行
Do While loop
先执行后判断,至少执行一次
For循环:
**倒序的关键字:reverse
将输出结果保存为一个新的集合关键字:yield**
scala> for(s <- str) println(s)
a
b
c
d
scala> val list = Array("Hadoop", "Spark", "Hive")
list: Array[String] = Array(Hadoop, Spark, Hive)
scala> for(a <- list) println(a)
Hadoop
Spark
Hive
#to:左闭右闭区间
scala> 1 to 10
res4: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
#Range:左闭右开区间
scala> Range(1, 10)
res5: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
#Range:左闭右开区间,生成1-9之间数字,其中参数2是步长
scala> Range(1, 10, 2)
res7: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
#until:左闭右开区间
scala> 1 until 10
res6: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> val r = 1 to 3
r: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)
scala> for(i <- r) println(i)
1
2
3
scala> for(i <- 1 to 3) println(i)
1
2
3