大数据——Scala入门
Scala入门Scala简介安装Scala编译器和开发环境Scala交互式编程(REPL)Scala初体验Scala概述Scala变量与常量使用类型别名定义变量Scala关键字列表Scala数据类型Scala数据类型层次结构字符串插值Scala条件控制if语句示例if...else语句示例if...else if...else语句示例条件语句返回值Scala任何表达式都有返回值示例代码块“{...
Scala入门
Scala简介
Scala源自Java
- Scala构建在JVM之上
- Scala与Java兼容、互通

Scala的优势
- 多范式编程:面向对象编程、函数式编程
- 表达能力强,代码精简

大数据与Scala
-
Spark采用Scala语言设计
提供的API更加优雅 基于JVM的语言更融入Hadoop生态圈

安装Scala编译器和开发环境
Scala交互式编程(REPL)

Scala初体验
- 编写HelloWorld
object HelloWorld {
def main(args: Array[String]): Unit = {
var a = "HelloWorld"
println(a)
}
}
//def:定义一个方法
//Unit:代表没有返回值
- 结果展示:

Scala概述
面向对象特性
- 每个值都是对象
- 对象的数据类型和行为由类(Class)和特征(Trait,类似于interface)描述
- 利用特征实现混入式多重继承
函数式编程
- 每个函数都是一个值
- 支持高阶函数、柯里化(currying)、样例化(case class)及模式匹配…
Scala是静态类型语言
扩展性:隐式类、字符串插值
Scala变量与常量
变量
- 赋值后可以改变,生命周期中可以被多次赋值
var 变量名称:类型=xxx
//一般无需显示指定类型,Scala编译器会自动推断出类型


常量
- 赋值后不可变,类似于Java中的final变量
val 常量名称:类型=xxx

定义多行字符串用三个双引号来表示分隔符,格式为:""" … “”"
var a ="""
我爱学习,
我爱Java,
我爱Scala
"""

使用类型别名定义变量
type关键字
type 类型别名=类型
var 变量名称:类型别名=xxx
val 常量名称:类型别名=xxx

Scala关键字列表
| abstract | case | catch | class |
|---|---|---|---|
| def | do | else | extends |
| false | final | finally | for |
| forSome | if | implicit | import |
| lazy | match | new | null |
| object | overwrite | package | private |
| protected | return | seailed | super |
| this | throw | trait | try |
| true | type | val | var |
| while | with | yield | (空格) |
| - | : | = | => |
| <- | <: | <% | >: |
| # | @ |
Scala数据类型
Scala与Java有着相同的原始数据类型
| 数据类型 | 描述 |
|---|---|
| Byte | 8位有符号整数。数值区间-128~127 |
| Short | 16位有符号整数。数值区间-32768~32767 |
| Int | 32位有符号整数。数值区间-2147483648 ~ 2147483647 |
| Long | 64位有符号整数。数值区间-9223372036854775808 ~ 9223372036854775807 |
| Float | 32位IEEE754单精度浮点数 |
| Double | 64位IEEE754双精度浮点数 |
| Char | 16位无符号Unicode字符。区间值为U+0000 ~ U+FFFF |
| Boolean | true或false |
| String | 等于java.lang.String |
Scala数据类型层次结构
- Any:所有类型的超类(顶级类型)
- AnyVal:表示值类型的超类
- AnyRef:表示引用类型的超类,对应java.lang.Object
- Unit:表示无值,类似Java中void
- Nothing:所有类型的子类
- Null:表示null或空引用

null是Null类型的唯一实例;nothing没有实例
字符串插值
s插值器:允许将变量引用、表达式直接插入字面字符中
val nam="James"
println(s"Hello,Sname")
//Hello,James
println(s"1+1=${1+1}")
//1+1=2

f值插值器
val height=1.9d
val name="James"
println(f"$name%s is $height%2.2f meters tall")
//%s:后面连接的字符串可以不加空格
//%2.2f:第一个2代表数值>=2不做变化,数值<2用空格补足,相差几就补足几个空格;第二个2代表保留两位小数

raw插值器
s"a\nb" //将输出换行符
raw"a\nb" //输出原始字符

Scala条件控制
if语句
val x=10
if(x>0){
print("x大于0")
}
Scala中换行等同于分号,所以分号可以省略
示例
object test {
def main(args: Array[String]): Unit = {
val x=10
if(x>0){
print("x大于0")
}
}
}
输出结果:
if…else语句
val x=10
if(x>10){
print("x大于10")
}else{
print("x小于等于10")
}
示例
object test {
def main(args: Array[String]): Unit = {
val x=10
if(x>10){
print("x大于10")
}else{
print("x小于等于10")
}
}
}
结果展示:
if…else if…else语句
val x=10
if(x>10){
print("x大于10")
}else if(x==10){
print("x等于10")
}else{print("x小于10")
}
示例
object test {
def main(args: Array[String]): Unit = {
val x=10
if(x>10){
print("x大于10")
}else if(x==10){
print("x等于10")
}else{print("x小于10")
}
}
}
结果展示:
条件语句返回值
Scala任何表达式都有返回值
val x=10
val y=if(x==10) x+1 else x //单行表达式可以省略{}
//y=?
示例
object test {
def main(args: Array[String]): Unit = {
val x=10
val y=if(x==10) x+1 else x //单行表达式可以省略{}
println(y)
}
}
结果展示:
代码块“{…}”也是表达式,返回值为最后一个表达式结果
val x=10
val y={
print("我是代码块")
x+1
}
//y=11

val x=10
val y={
x+1;print("我是代码块")
}
//多个表达式使用“;”分隔
//y=?

Scala循环控制
while循环
var num: Int = 0;
while ( num < 100 ) {
println( num );
num = num + 1;
}
示例
object test {
def main(args: Array[String]): Unit = {
var num: Int = 0;
while ( num < 100 ) {
println( num );
num = num + 1;
}
}
}
输出结果:

do…while
var num: Int = 0;
do {
println( num );
num = num + 5;
} while ( num < 200 )
示例
object test {
def main(args: Array[String]): Unit = {
var num: Int = 0;
do {
println( num );
num = num + 5;
} while ( num < 200 )
}
}
结果展示:

for循环
val num:Int = 10;
for ( i: Int <- 1 to num )
{
println( i * 100 );
}
for { i: Int <- 1 until 100 }
{
val y = 2*i;
println( y );
}
"i to j"或者"i until j"均表示创建一个区间Range
区别:to表示=这个数字;until表示<这个数字
示例
object test {
def main(args: Array[String]): Unit = {
val num:Int = 10;
for ( i: Int <- 1 to num )
{
println( i * 100 );
}
}
}
结果展示:
object test {
def main(args: Array[String]): Unit = {
for { i: Int <- 1 until 100 }
{
val y = 2*i;
println( y );
}
}
}
结果展示:

打印直角在左下的直角三角形
object test {
def main(args: Array[String]): Unit = {
//打印直角在左下的直角三角形
for(i<-1 to 5) {
for(j<-1 to i) {
print("*")
}
println()
}
}
}
结果展示:
打印直角在左上的直角三角形
object test {
def main(args: Array[String]): Unit = {
//打印直角在左上的直角三角形
for(i<-5 to 1 by -1) {
for(j<-i to 1 by -1) {
print("*")
}
println()
}
}
}
结果展示:
打印直角在右下的直角三角形
object test {
def main(args: Array[String]): Unit = {
//打印直角在右下的直角三角形
for(i<-1 to 5 ) {
for(j<-1 to 5-i ) {
print(" ")
}
for(j<-1 to i){
print("*")
}
println()
}
}
}
结果展示:
打印直角在右上的直角三角形
object test {
def main(args: Array[String]): Unit = {
//打印直角在右下的直角三角形
for(i<-1 to 5 ) {
for(j<-1 to i-1 ) {
print(" ")
}
for(j<-1 to 6-i){
print("*")
}
println()
}
}
}
结果展示:
打印等腰三角形
object test {
def main(args: Array[String]): Unit = {
//打印等腰三角形
for(i<-1 to 5){
for (j<-1 to 5-i) {
print(" ")
}
for(j<-1 to 2*i-1){
print("*")
}
println()
}
}
}
结果展示:
打印空心等腰三角形
object test {
def main(args: Array[String]): Unit = {
//外循环决定行,内循环决定列 共5行 固 i为1-5
for(i<-1 to 5) {
//空格数从 4-0 固 5-i
for(j<-1 to 5-i) {
print(" ")
}
//*的数量 为 1 3 5 7 固 2*i-1
for(j<-1 to 2*i-1) {
//空心 顾名思义 只留最边的*号
if(j==1 || j==2*i-1 ||i==5){
print("*")
}else{
print(" ")
}
}
//后续空白 有无无所谓 同第一个内循环
for(1<-1 to 5-i){
print(" ")
}
println()
}
}
}
结果展示:
九九乘法表
object test {
def main(args: Array[String]): Unit = {
for(i<-1 until 10) {
for(j<-1 to i) {
print(i+"*"+j+"="+(i*j)+"\t")
}
println()
}
}
}
结果展示:
中断
import.scala.util.control.Breaks._
val num:Int = 10;
for ( i: Int <- 1 to num by 2 ) {
if(i>=5) break;
println( i * 100 );
}
by表示步长
import scala.util.control.Breaks
var num=10
val loop=new Breaks
loop.breakable(
for(x<-num to 1 by -1) {
if(x<3)loop.break
println(x)
}
)
示例
object test {
def main(args: Array[String]): Unit = {
import scala.util.control.Breaks._
var num=10
breakable{
for(x<-num to 1 by -1) {
if(x<3)break
println(x)
}
}
}
}
结果展示:
for循环过滤
val num:Int = 10;
for ( i: Int <- 1 to num; if i%2==0;if i>5 ) //多个条件时使用分号(;)
{
println( i * 100 );
}
for循环返回值
for循环中的yield会把元素记下来,保存在集合中,循环结束后将返回该集合。也称for推导式
val num:Int = 10;
var retVal=for ( i: Int <- 1 to num; if i%2==0;if i>5 ) yield i; //for循环使用yield将具有返回值
for(a<-retVal){
println(a);
}
//输出6 8 10
示例
var i=100
val resValue = for (x <- 1 to i; if x % 2 == 0; if x % 5 == 0) yield x
println(resValue)
for(i<-resValue) {
println(i)
}
结果展示:
使用Scala编程输出如图所示加法表
object test {
def main(args: Array[String]): Unit = {
for(i<-0 to 6 by 1) {
println(s"$i+${6-i}=6")
}
}
}
结果展示:
Scala数组
存储固定大小的元素
数组索引从0开始
//数组创建方式一
var a1:Array[String] = new Array[String](3) //泛型使用方括号
a1(0)="Jason" //数组元素访问使用圆括号
a1(1)="Marie"
a1(2)="Jimmy"
//数组创建方式二
var a2=Array("Jason","Marie","Jimmy") //调用Array的伴生对象中的apple()返回Array实例
//数据创建方式三:区间数组
var a3=Array.range(1,10,2)
Scala元组
可以包含不同类型的元素
最多支持22个元素(Tuple1~Tuple22)
使用下划线“_”访问元素,“_1”表示第一个元素
//元组声明方式一
var tp1 = ("Mike", "123 ABC street", 58)
println(tp1._1)
println(tp1._2)
println(tp1._3)
//迭代元组
tp1.productIterator.foreach{ i =>println("Value = " + i )}
//元组声明方式二
var tp2 = new Tuple3("Mike", "123 ABC street", 58)
//元组声明方式三
def mike = "Mike" -> 5
//输出scala.Tuple2
mike.getClass
//将元组元素依次赋给三个变量
val(name, address, age) = tp1
println(name)
println(address)
println(age)
输出结果:
Scala集合(一)
Seq
- 序列,元素按顺序排序
Set
- 集合,元素不重复
Map
- 映射,键值对集合

Scala集合(二)
不可变集合
- scala.collection.immutable,默认Scala选择不可变集合
可变结合:可以修改、添加或移除一个集合的元素
- scala.collection.mutable
var a=scala.collection.mutable.ListBuffer(1,2,3)
a(1)=1
a
var b=List(1,2,3)
b.getClass
b.drop(1)
a
b

Scala集合(三)
Scala.collection.immutable
Set:ListSet、HashSet、TreeSet
Map:ListMap、HashMap、TreeMap
Seq:Vector、String、Range、List、Stack、Stream、Queue

Scala集合(四)
scala.collection.mutable
Scala集合(五)
常用集合
| 名称 | 可变/不可变 | 示例 |
|---|---|---|
| Buffer | mutable | val buffer=scala.collection.mutable.ArrayBuffer[Int](10,20,30); buffer+=(2,3) |
| Array | mutable | val arr=Array(1,2,3) |
| List | immutable | val lst=List(1,2,3) |
| Map | mutable | val stu=Map(“name”->“Jason”,“age”->“18”) |
| Set | mutable/immutable | val set=Set(1,2,3) |
| Vector | immutable | val v=Vector(1,3,5,7,11,13) |
| Stack | mutable/immutable | val st=scala.collection.mutable.Stack(1,2,3) //堆栈,先进后出 |
| Queue | mutable/immutable | val q=scala.collection.mutable.Queue(1,2,3) //队列,先进先出 |
| BitSet | mutable/immutable | val bit=scala.collection.mutable.BitSet(3,2,0) //位集合 |
| ListMap | immutable | val map=scala.collection.mutable.ListMap(1->“one”,2->“two”) |
| HashSet | mutable | val set=scala.collection.mutable.HashSet(1,2,3) |
| HashMap | mutable | val stu=scala.collection.mutable.HashMap(“name”->“Jason”,“age”->“18”) |
Scala List常用操作
var c = List[Char]('a', 'b', 'c')
var x = 'x' +: c // (x, a, b, c)
var y = c :+ 'x' // (a, b, c, x)
import scala.collection.mutable._
var lb = ListBuffer[Int](1, 2, 3, 4)
lb += 100 //1, 2, 3, 4, 100
lb += (21, 33)//
88 +=: lb //88, 1, 2, 3, 4, 100, 21, 33
List(77, 66) ++=: lb
var l = List[Int](2, 3, 4, 6, 8, 9, 11, 20)
var x = l grouped 3 //等价l.grouped(3)
x.next() //(2, 3, 4)
x.next() //(6, 8, 9)
var y = l sliding 2
y.next() // (2, 3)
y.next() // (3, 4)
var a1 = Array[Int](1, 2, 3, 4)
var a2 = Array[Int](100, 200, 300, 400)
var a = List.concat(a1, a2)//Array->List
a3=a1++a2 //Arrays->Array
a(3) = 333 //Error
a3(3)=333 //OK
var b = Array(333, "333", '3', false )
var c = List.concat(a, b)
val x = a.filter( _ %2 != 0 )
val y = a.reverse
var m = a.groupBy(t => t%2 == 0)
var n = a.slice(2, 4)
a.sorted //1, 2, 3, 4, 100, 200, 300, 400
a.sorted( Ordering.Int.reverse )
a.sortWith( _ > _ )
a.sortBy( x => x ) //升序
a.sortBy( x => x*(-1) ) //降序
Scala Set常用操作
var s = Set("ab", "yz")
s += "mn" //mn, ab, yz
s += "mn" //??
s -= "yz" //mn, ab
var t = Set("ab", "gh", "mn", "st", "yz" )
t -- s //gh, st, yz
t ++ s //ab, gh, mn, st, ya
var os = SortedSet(1, 99, 66, 54, 77 )
os //1, 54, 66, 77, 99
os += 33
os //1, 33, 54, 66, 7
var s = Set("ab", "yz")
var t = Set("ab", "gh", "mn", "st", "yz" )
//求交集
t & s
t intersect s
//求并集
t | s
t union s
//求差集
t &~ s
t diff s
Scala Map常用操作
var m = Map[String, Int]("a"->1, "b"->2, "c"->3, "d"->4, "e"->5, "f"->6, "g"->7, "h"->8, "i"->9)
m("a") //1
m += ("j"->0)
m += ("j"->0) //??
m += ("j"->11) //??
var n = m ++ Map[String, Int]("a"->3, "j"->99) //??
n -= ("g", "e")
Scala Stream & Vector
Stream是List惰性版(需要的时候再去调用)
val stream = (1 to 1000).toStream
stream // Stream(1, ?)
stream.head // 1
stream.tail // Stream(2, ?)
stream(3)
stream.tail // Stream(2,3,4,?)
Vector拥有连续的内存空间,利于随机存取(直接访问)
val v = Vector.empty :+ 2 :+ 2
val v1 = v ++ Vector[Int](3)
v.length
v1.length
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)