一。Scala概述
为何学习Scala?
可扩展,兼容java,语法简洁,静态类型化,支持并发控制(运行在JVM虚拟机上)
二。scala下载安装
1.安装jdk1.8,scala运行依赖java
2.下载scala压缩包解压即安装成功,并配置环境变量
3.测试:启动CMD,运行scala查看版本信息
三。开发Scala
1.命令行开发scala
1.写个scala文件: HelloScala.scala
2.编译 scalac HelloScala.scala (就像javac Demo1.java)
3.运行class文件 scala com.saprk.HelloScala (就像java Demo1)
2.idea开发scala
一、先安装scala并配置环境变量
二、idea安装scala插件(安装插件的两种方式见下面)
三、idea创建scala,类型选择Object,定义main方法,然后运行
方式一:
1.idea先安装scala插件
File————Setting————Plugins————Scala————Install
2.idea创建项目并鼠标点击项目名称,右键,add FrameworkSupport,勾选scala,应用
如果找不到scala可以勾选,file——project Structure——modules——dependencies,选择scala去掉,重新add FrameworkSupport
方式二:
pom文件加scala插件
<build>
<finalName>spark</finalName>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
三。基础语法
1。声明与定义
常量声明:val
val x:T = e 或
val x = e(类型省略,默认类型)
变量声明:var
var x:T = 3 或
var x = 3(类型省略,默认类型)
函数声明:def
def adder(x:Int,y:Int) = x + y
def adder() = e
无参函数:
类型声明:type
类声明:class
对象声明:object
2。数据类型:4 2 1 1和java一样,加一个String
整型值: Short,Int,Long,Byte
浮点型值:Float,Double
布尔值: Boolean
字符值: Char(单引号,单字符)
String:双引号
几个特殊类型:Unit None Nothing
3。操作符运算
= - * / %
> < >= <= =
&& ||
== !=
& | ^ ~
4。语句
判断语句 循环语句 枚举语句 匹配语句 异常 输入输出
if while for match throw/try readLine/readInt/println
5。数组和集合
数组
val A = new Array[int](10)
val B = Array(N1,N2)
Array(List(1,2,3,4),List(1,2,3,4))
集合
List(1,2,3,4)
6。映射(相当于map)
数组是包含一组元素的集合,映射是包含一组键值对应元素的集合
1.不可变映射:Map(a1->b1,a2->b2,a3->b3)
2.可变映射:
val X = scala.collection.mutable.Map((a1,b1),(a2,b2),(a3,b3))
val X = new scala.collection.mutable.Map[T1,T2]
7。元组
元组是不同类型的值的聚集
声明:val g = (1,'A',"hello")
取第一个值: val h=g _1
8.zip方法:把几个集合结合起来
val one = Array('a','b','c')
val two = Array(1,2,3)
val three = one.zip(two) 或 one zip two
遍历数组结合zip方法可以生成映射
9。包的引入与作用范围
10.打印
listRDD.collect().foreach(println)
result.foreach(println)
四。类、对象与构造器
//类
class month{
val one = 25
var two = 15
var three : int
def firstday =
def now =
def now_ =
def lastday(m_char) = {}
}
//对象
object WordCount {
def main(args: Array[String]): Unit = {
}
}
五。伴生对象
1.定义:当一个单例对象存在同名类的时候,这个对象称为伴生对象
2.案例
class HelloWorld(...)
object HelloWorld(...)
3.特点:
a.类和其伴生对象可以互相访问私有属性,但必须存在同一个源文件中
b.类的伴生对象可以被访问,但并不在作用域中
六。高阶函数
1.头等函数
2.匿名函数
即不命名的函数, (x:int) => x*2
val f2 = (a:int) => a*2
3.柯里化
指的是将接受两个参数的函数变成新的接受一个参数的函数过程 (将A函数转换成功B函数,A函数接受两个参数,B函数接受一个参数)
4.控制抽象
七。模式匹配
模式匹配是数据结构上的概念,数据结构包括数组,集合,类,函数等
通配符 _ 表示任意,_* 则表示任意长度
除了结构匹配,还有类型匹配
1.样式匹配
2.样例类
3.封闭类
4.偏函数
八。泛型
九。型变
协变 class Stack[+T]
逆变 class Stack[-T]
十。注解
1.定义:能被编译器或外部工具处理的一些信息
2.案例
a.给主构造器添加注解,需要加注解放在构造器前面,并听添加一对括号:
class Credentials @Inject() (var username:String,var password:String)
b.给表达式添加注解:在表达式后面加冒号,然后是注解
(myMap.get(key)):@unchecked) match { }
c.为类型参数添加注解
class MyContainer[@specialized]
d.针对实际类型的注解应放置在类型名称之后
String @cps[Unit]
3.注解举例
废弃 @deprecated
易变字段 @volatile
自动的get/set方法对 @scala.reflect.BeanProperty
不检查: @unchecked
生成跳转表: @switch
基本类型特殊化: @specialized
十一。Actor和并发
1.定义:
a.Actor:一种便于使用的并发模型,是scala用于大数据处理的结构基础
b.并发:将一个计算机任务,分成几个小的部分,让它们同时被计算,之后再汇整计算结果
c.常见的并发结构:多线程,分布式计算,消息传递,资源共享(内存共享)
d.常用的并发模型:参与者模式,Petri网,通信顺序进程
2.scala使用actor作为其并发编程模型
一种基于消息传递而非资源共享的并发模型,能尽可能避免死锁和共享状态
actor可以理解为虚拟线程,能实现线程的复用,从而产生数百上千的actor并有效控制系统开销
3.actor使用原则
a.避免共享
b.不调用方法
c.足够简单
d.异步调用
e.使用react
f.容错
十二。集合
集合的创建
val list = List(("a",1),("b",2),("c",3)) //大写
集合的遍历
x.foreach((i:Int) => println(i))
for(i <- fruits) println(i)
for(i <- 0 until fruits.size) println(s"$i is ${fruits(i)}")