Spark第一步之学习Scala
文章目录
前言
一、Scala语言的特点
优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以速度会快很多。
能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
学习Scala编程语言,为后续学习Spark和Kafka奠定基础。
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于JVM平台(Java虚拟机),并兼容现有的Java程序。
二、Scala与Java的关系是什么?
Scala与Java的关系是非常紧密的,因为Scala是基于JVM(JAVA虚拟机)的一门编程语言。所有Scala的代码,都需要经过编译为字节码,然后交由JVM来运行。
所以Scala和Java是可以无缝互操作的。Scala可以任意调用Java的代码。所以Scala与Java的关系是非常非常紧密的。
Scala是基于Java的,但却高于Java。
三、学习Scala
1.安装Scala
1.安装JDK以及Scala解释器并配置环境
因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK,我们这里安装的是JDK1.8版本。
http://www.scala-lang.org/
配置SCALA_HOME
配置PATH
验证安装配置是否成功
idea插件的安装(记得配置SDK就是你解压文件的路径)
2.Scala基本语法
在scala中,有以下数据类型。例如:
Byte、Char、Short、Int、Long、Float、Double、Boolean
貌似与Java的基本数据类型的包装类型相同,但是scala没有基本数据类型与包装类型的概念,统一都是类。scala自己会负责基本数据类型和引用类型的转换操作类型的加强版类型
Any是abstract类,它是Scala类继承结构中最底层的。所有运行环境中的Scala类都是直接或间接继承自Any这个类。
AnyRef是所有引用类型的基类。
AnyVal 所有值类型的基类。
Nothing是所有类的子类,是一个类。Nothing没有对象,但是可以用来定义类型。
Any:等价于java中的Object
AnyVal:等价于java中的基本数据类型
AnyRef:等价于java中的引用数据类型
Unit:等价于java中的void
nothing:任何类的子类
1、变量的定义
在Scala中声明一个变量:不管是什么类型的变量,在声明时统一使用var和val来声明
var :表示声明一个变量
val:表示声明一个常量 相当于java中的final
注意事项
- 声明变量时, 类型可以省略(编译器自动推导,即类型推导)
- 类型确定后, 就不能修改, 说明Scala 是强数据类型语言.
- 在声明/定义一个变量时, 可以使用var 或者 val 来修饰, var 修饰的变量可改变,
val 修饰的变量不可改 - var 修饰的对象引用可以改变, val 修饰的则不可改变, 但对象的状态(值)却是
可以改变的。 - 变量声明时, 需要初始值。
程序中 +号的使用
- 当左右两边都是数值型时, 则做加法运算
- 当左右两边有一方为字符串, 则做拼接运算
scala> var str=" 琦"
str: String = 琦
scala> var age=18
age: Int = 18
scala> str="腾"
str: String = 腾
scala> val str3="方"
str3: String = 方
scala> str3="牛"
<console>:12: error: reassignment to val
str3="牛"
scala> var name="马"
name: String = 马
scala> var usename:String ="娜娜"
usename: String = 娜娜
scala> var s = 1
s: Int = 1
scala> var c = 2
c: Int = 2
scala> var b = s+ c
b: Int = 3
scala> var d = "m"
d: String = m
scala> var b = s+d
b: String = 1m
Scala的浮点型常量默认为Double型, 声明Float型常量, 须后加‘f’或‘F’
字符类型可以表示单个字符,字符类型是Char, 16位无符号Unicode字符(2个字节),
区间值为 U+0000 到 U+FFFF,字符常量是用单引号(‘ ’)括起来的单个字符。
object test {
def main(args: Array[String]): Unit = {
var c1 : Char = 'a'
var num : Int = 10 + c1 + 'b' //205
var c2 : Char = 'a' + 1//错误
println(num)
}
}
强制类型转换
Ø 介绍
自动类型转换的逆过程, 将容量大的数据类型转换为容量小的数据类型。 使用时要
加上强制转函数, 但可能造成精度降低或溢出,格外要注意。
Ø 案例演示
java : int num = (int)2.5
scala : var num : Int = 2.7.toInt //对象
标识符的命名规范
标识符概念
1) Scala 对各种变量、 方法、 函数等命名时使用的字符序列称为标识符
2) 凡是自己可以起名字的地方都叫标识符
标识符的命名规则(记住)
Scala中的标识符声明, 基本和Java是一致的, 但是细节上会有所变化。
1) 首字符为字母, 后续字符任意字母和数字, 美元符号, 可后接下划线_
2) 数字不可以开头。
3) 首字符为操作符(比如+ - * / ), 后续字符也需跟操作符 ,至少一个(反编译)
4) 操作符(比如+-*/)不能在标识符中间和最后.
5) 用反引号`....`包括的任意字符串, 即使是关键字(39个)也可以 [true]
hello // ok
hello12 // ok
1hello // error
h-b // error
x h // error
h_4 // ok
_ab // ok
Int // ok, 在scala中, Int 不是关键字, 而是预定义标识符,可以用, 但是不推荐
Float // ok
_
// 不可以, 因为在scala中, _ 有很多其他的作用, 因此不能使用
Abc // ok
+*- // ok
+a // error
2、基本操作符
运算符是一种特殊的符号, 用以表示数据的运算、 赋值和比较等。
- 算术运算符
- 赋值运算符
- 比较运算符(关系运算符)
- 逻辑运算符
- 位运算符
对于除号“/”, 它的整数除和小数除是有区别的: 整数之间做除法时, 只保留
整数部分而舍弃小数部分。 例如: var x : Int = 10/3 ,结果是 3
当对一个数取模时, 可以等价 a%b=a-a/b*b , 这样我们可以看到取模的一个本
质运算(和java 的取模规则一样)。
注意: Scala中没有++、 --操作符, 需要通过+=、 -=来实现同样的效果
3.流程控制
- 顺序控制
- 分支控制
- 循环控制
object test {
def main(args: Array[String]): Unit = {
var sumVal = 9
val result1 = {
if (sumVal > 20) {
"结果大于20"
}
}
sumVal = 90
println(result1) //()
val result2 =
if (sumVal > 20) {
"结果大于20"
}
println(result2) //结果大于20
}
}
for 循环
Scala 也为for 循环这一常见的控制结构提供了非常多的特性, 这些for 循环的
特性被称为for 推导式( for comprehension) 或for 表达式( for expression)
范围数据循环方式1
Ø 基本案例
for(i <- 1 to 3){
print(i + " ")
}println()
说明
- i 表示循环的变量, <- 规定好 to 规定
- i 将会从 1-3 循环, 前后闭合
范围数据循环方式2
Ø 基本案例
for(i <- 1 until 3) {
print(i + " ")
}println()
说明:
- 这种方式和前面的区别在于 i 是从1 到 3-1
- 前闭合后开的范围,和java的arr.length() 类似
循环守卫
Ø 基本案例
for(i <- 1 to 3 if i != 2) {
print(i + " ")
}p
rintln()
2) 上面的代码等价
for (i <- 1 to 3) {
if (i != 2) {
println(i+"")
}
}
Ø 基本案例说明
- 循环守卫, 即循环保护式( 也称条件判断式, 守卫) 。 保护式为true则进入
循环体内部, 为false则跳过, 类似于continue
引入变量
Ø 基本案例
for(i <- 1 to 3; j = 4 - i) {
print(j + " ")
} Ø
2) 上面的代码等价
for ( i <- 1 to 3) {
val j = 4 –i
print(j+"")
}
对基本案例说明
- 没有关键字, 所以范围后一定要加; 来隔断逻辑