尚硅谷大数据技术之Scala(韩顺平)
第一章:Scala概述
一.Scala背景
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。大数据三个问题
1.数据采集
2.数据存储(HBase)
3.数据计算(Spark,Flink,Mapreduce……)。计算分两种
1.离线计算:MapReduce;
2.实时计算:Spark(内存级大数据计算框架)
Scala是多范式编程语言,多种编程方式
1.面向对象
2.函数式
Scalable Language
Spark的兴起带动了Scala
发明者Martin Odersky主写Java 1.5与Java8编译器,从Pizza和Scala里引入大量特性到Java
Scala程序目的是高效、简单,少些代码。递归是达到这个目的的重要手段
Scala有以下特性
1.可以使用Java部分语法
2.Scala特有语法
3.增加函数式编程
1.偏函数
2.函数柯里化
3.高阶函数
4.纯函数
5.函数作为参数
……
4.Scala类可以是对Java形式上的一种包装(继承,实现接口等)
Scala天生语法层面支持并行计算,可以较好的用于大数据计算开发
二.Scala特点
1.多范式静态编程语言
2.运行在JVM上
3.简洁高效,删除了三目、++、--运算符
快速学习办法:
1.学习Scala特有语法
2.搞清楚与Java区别
3.如何规范使用Scala
三.搭建环境
Windows:1.安装JDK 2.安装Scala程序安装包 3.配置环境变量SCALA_HOME为scala安装路径,并把bin目录加到Path里
Linux:也类似,解压tar包,设置PATH环境变量
Idea Scala插件安装:搜索Scala插件安装
四.Scala快速入门
object HelloScala{ def main(args: Array[String]) :Unit={ println("hello scala) } }
object表明一个伴生对象,ojbect 对象名,生成一个“HelloScala$”的伴生匿名类,这个类的静态对象名字叫做MODULE$
先从HelloScala类的main方法执行,会调用HelloScala$.MOUDLE$里的同名方法接着执行
这里可以看到Scala对Java类的包装
Scala认为静态的不是面向对象,所以class里没有,静态的放object里
关键字def定义一个方法
Scala将参数名放前边,类型放后边,用:分隔
Array[String]表示类型为String数组
Unit为空
函数签名与返回结果用:隔开
一般scala可以执行javac编译出来的class文件,java不能执行scalac编译出来的class文件,可能会少类引用
scala可以直接编译、运行scala文件一步走
五.Idea创建Scala项目
1.创建一个原生maven项目
2.main目录下创建一个scala文件夹,标记为Source Root
3.默认不能写Scala程序,点击项目名,点击“Add Framework Support”,选Scala
4.创先新Scala文件。有三种类型,Class,Object,Trait
五.Java模拟Scala快速入门程序
总而言之,就是使用一个内部类,里边有个静态对象,这个静态对象的代码与scala里写的一样,主类同名的方法调用这个单例对象的同名方法
ojbect等同于声名一个单例的内部类静态对象
scala给java做了一个包装
六.Scala程序总结
1.源码后缀为scala
2.执行入口为main函数
3.Scala区分大小写
4.Scala程序不需要加分号
5.同一行多个语句,要用分号隔开
七.Scala转义字符与Java一样
八.字符串输出三种方式
1.用+相连
2.printf
3.s""这种形式,直接在s引导的双引号里用$引用变量。{}包起来表明是个表达式,里边可以直接计算
九.关联Scala源码
Ctrl+b查看源代码
Ctrl+Alt+l格式化代码
源码包要引入,maven可以直接下载
十.注释
三种注释格式
1.单行注释
2.多行注释
3.文档注释
每个函数都要有个注释
scaladoc -d 【输出目录】 【源码目录】
tab键右移动,shift+tab键左移动
一行不超过80个字符
十一.多看Scala官方编程指南手册
第二章:变量
一.基本使用
变量是程序的基本组成单位
声明变量:var 变量名:类型 = 初始值。声明变量时必须初始化变量
赋值变量:变量名=数值
Scala中,常量小数默认为Double,整数默认为Int类型,Float/Long常量要用f/F/l/L修饰
变量指向的对象放在栈还是堆里:基本类型放栈里,对象放堆里。逃逸分析会进一步分析,被多个变量引用生命周期很长的对象被放在堆里
二.注意事项
声明变量语法
(var | val )变量名[:变量类型] = 变量值
1.变量类型不写,类型自行推导
不写类型,确认类型有两个办法
1.使用变量时idea提示
2.变量调用isInstanceOf[Int]判断
2.类型确认后,不能修改,强类型语言。只能改值,但是不能给另一个类型的值
3.val代表final,声明的是常量
val使用效率高,这种变量没有线程安全问题,是只读的,不会被修改,底层好实现不需要同步保护
val是指可以改变对象里的内容,但是不改变指向的对象
4.加号:两边是数字相加,两边是字符串连接字符串
三.数据类型一览图
Scala中所有数据类型对应的都是对象,没有原生基本类型
Scala数据类型分量两大类
1.AynVal,值类型
2.AnyRef,引用类型
这种类型体系让Scala把面向对象与面向过程完美结合在一起
各种数据类型类带有各种to方法,比如toString转化为字符串
Scala中,一个方法如果没有型参,调用的时候可以不用带小括号
类型体系如下图
1.根类Any是所有类的父类
2.Scala里一切皆对象。分为两大类,AnyVal和AnyRef
3.Null类是Scala特别类型,只有一个对象值,null。它是所有AnyRef类的子类
4.Nothing是所有类的子类;可以将Nothing类型修饰任意变量或者函数,即任意类型都可以被转换为Nothing没有任何限制。
在抛异常的时候定义返回值类型比较多;Nothing是没有对象的,具有特权可以强制定义异常类型为Nothing,这样被外边的父类型接收的时候就可以自动转换当作父类型,是可以兼容很多地方的。所以哪怕函数返回的是正常类型,Exception也可以转换为Nothing类型
比如if语句是表达式,有返回值,必然有返回值类型,如果x < 0,抛出异常,返回值的类型为Nothing,Nothing也是Int的子类,所以,if表达式的返回类型为Int,get方法的返回值类型也为Int;如果if直接返回Exception类型则Exception无法与Int类型做转换,需要加Nothing做桥梁
5.低精度类型的值可以向高精度类型的值转换,叫做隐式转换
6.Uint和void相同,具体值只有一个为()
7.计算机二进制里,负零来表达负数最小数
8.Double比Float小数点精度多七位
9.Char有两个字节表示,用单引号包起来
10.当把一个计算后的结果赋给一个变量,编译器会检查结果类型/范围与变量类型/范围是否匹配,匹配自动转换;当把一个常量赋给变量,编译器只会看范围是否匹配,不会看类型是否匹配。所以,可以写 var cha:Char = 98; ,98虽然是个Int,但是没有超过Char的范围;却不可以写 var lon:Long = 5989068236259268946 ,5989068236259268946超过Int范围了,不能pass,要加l/L修饰才行。
这是因为计算会有临时变量,不是常量了
11.boolean只能是true和false
12.10 max 2和10.max(2)等价,只有一个参数
13.更大的数有 BigInt等类
四.值类型自动转换
1.有多种数据类型混合计算的时候,自动将所有数据转为容量最大的数据类型
2.对于变量,大的数据类型转给小的数据类型默认会报错
3.Byte和Char不会自动转换
4.Byte,Char,Short在混合计算时会自动转成Int,Int是最低精度
5.自动提升原则:表达式的结果类型自动提升为操作数中最大的类型
6.还有高级隐式转换和隐式函数
五.值类型的强制转换
用自带的toInt等函数转换,会有损失精度风险
强制转换只针对最近的操作数有效
Byte和Short参与计算时变成Int类型
六.值类型与String类型的转换
基本类型转字符串:+ ""
Idea里操作符带下滑横线表明编译器自动做类型转换
String自带的toInt等方法将String转为基本类型
Double字符串不能转为Int
七.标志符的命名规范
凡是可以取名字的地方,变量/方法/函数,都叫标志符
1.首字符是字母,数字,下划线,美元符号
2.数字不可以开头
3.首字符是算数运算符,后边也要跟个算数运算符
4.操作符不能放在中间和尾部
5.反引号包起来的字符串里可以使用关键字 ,底层有改名
底层编译处理:
把操作符转为英文名字并以美元符号开头
Int不是关键字,是预定义标志符
Scala关键字:一共39个
第三章:运算符
运算符分五类
1.算数运算符
2.赋值运算符
3.比较运算符(关系运算符)
4.逻辑运算符
5.位运算符
一.算数运算符
1.a % b等价于a - a / b * b
2.在scala没有++和--,用+= 1代替
3.运算的时候5和5.0一定要设好,看要不要算小数
二.关系运算符
1.浮点数比较,类型一定要相等,精度要相同
三.逻辑运算符
1.最后的返回值是个Boolean值
四.赋值运算符
1.除了=,还有各种组合等号,比如&=
2.代码块也有返回值,{}可以赋给变量
3.不使用中间变量,交互两个数。a = a + b;b = a - b;a = a - b。或者用位运算
五.位运算符
>>>是无符号右移(符号位不动)
六.特别注意
1.Scala不支持三目运算符,用if else代替
七.运算符优先级
只有单目运算和赋值运算方向从右到左,其他从左到右
逗号运算符返回一个用()扩起来的元祖
八.输入
StdIn.readLine读取一行
第四章.流程控制
一.顺序控制
1.引用变量采用向前引用,先声明定义再使用
2.函数顺序可以随便搞
第五章
