Scala介绍
Posted 曹建龙技术分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala介绍相关的知识,希望对你有一定的参考价值。
Scala语言很强大,集成了面向对象和函数式编程的特点。
大数据中为什么学习scala
spark是scala语言编写
Scala的特点
1)优雅
框架设计中第一个要考虑的问题就是API是否优雅。
精简的封装。
代码精简(少)。
2)速度快
scala语言表达能力强。
一行代码等于多行java代码,开发速度快。
3)完美的融合hadoop生态
scala是静态编译,表达能力强,并且代码量少。
Scala安装
1)下载
2)解压
3)配置环境变量
scala_home
path
Scala基础语法
1)scala程序的开始
helloworld
案列:
object Helloworld{
def main(args:Array[String]){
print("Helloworld")
}}
2)scala的数据类型
scala和java一样,有8种数值类型;
Byte/Char/Short/Int/Long/Double/Boolean 和Unit类型(类似void表示无值)
scala没有包装类型
3)定义变量
关键字:val var
val:定义的变量值是不可变的
var:定义的变量值是可变的
scala自动推导变量类型
Unit = ()
()相当于什么也没有用()表示
4)条件表达式
if:判断
val y = if(x>0) 1 else 2
Any:Any包含Anyval和AnyRef
Anyval:包含scala所有类型
AnyRef:scala classes与java classes
Any相当于java的Object
5)块表达式
在scala中{}包含一系列表达式,块中的最后一个表达式的值就是块的值
6)循环
yield:生成一个新的集合
7)
定义函数
1)方式1(方法转化函数)
res0: (Int, Int) => Int = <function2>
<function2> 代表一个函数并且有2个参数
方法转换成函数
函数名加空格加下划线(m1 _)
=>代表函数
Int代表返回值类型
2)标准定义函数
定义函数:
val h1 = (a:Int,b:Int) => {a*b}
h1表示函数名
(a:Int,b:Int)函数的参数类型
{a*b}函数体
传值调用&传名调用
函数式编程:方法的参数可以是一个函数
传值调用:
1.先计算balance的值
2.把这个值作为参数传递给parintMoney
传名调用:传递的是函数
1.将balance方法的名称传递到方法内部执行
可变参数函数
java中的可变参数:public static m1 (String ... args){}
scala中的可变参数:def sum(ints:Int*):Int={}
加了一个通配符*
默认参数值函数
def sum(a:Int=5,b:Int=6):Int ={a+b}
高阶函数
定义:将其他函数作为参数,或者其结果是函数的函数
部分参数应用函数
如果函数传递所有预期的函数,则表示完全应用他了
如果只传递几个参数,并不是全部参数,那么将返回部分应用的函数
字符串的格式化输出
文字插值器:f/s
柯理化
指的是将原来接收的俩个参数的函数变为一个新的接收一个参数的函数,这样一个过程
函数的通用性降低,但是适用性提高
scala偏函数
被包在花括号内没有match的一组case语句的是一个偏函数
PartialFunction[A,B]
A:表示参数类型
B:表示返回类型
常用于模式匹配
scala数组
数组定义[1]:var arr = new Array[String](3)
String:存储的元素类型
3:存储3个元素
添加元素:arr(1) = "Aaron"
数组定义[2]:val arr = Array[Int](3,5,8,6)
改变内容:arr(1) = 18
添加元素:arr += 22 不可以改变
数组方法
方法map(映射)
映射:2 4 6
映射关系:f(x) = x * 5
对应映射关系: 10 20 30
方法flatten
扁平化操作
方法flatMap
相当于先map操作再做flatten操作
方法foreach
遍历数组中的元素
方法groupBy
分组
方法sortBy
排序
集合
scala集合有俩种类型:
可变:mutable
不可变:Immutable
不可变集合:内容不可变(数组内容可变),长度不可变
val b = List(1,2,3)
可变集合:
内容可变buff(1) = 200
长度可变 buff += 200
需要导包:import collection.mutable._
长度可变的数组
创建长度可变数组
val ab = scala.collection.mutable.ArrayBuffer(2,3,4)
长度可变
ab += 400
Seq序列
不可变的序列
import scala.collection.immutable._
在scala中列表要么为空(Nil表示空列表)
head元素上加一个tail列表
head:取头元素
tail:取尾元素
Nil 表示空列表
5::Nil 空列表的头部加入一个元素
1::2::3::Nil 空列表前加入三个元素
+ 字符串的拼接
++ 俩个集合相加、
++:合并集合
.+: 头部追加元素
:+ 尾部追加元素
::: 俩个集合相加
count 统计个数
filter 过滤
sortBy 排序
sortWwith 排序
sw.sortWwith((x,y) => x._2 > y._2)
groupBy分组
fold 折叠
sw.fold(1)((x,y) => x+y)
foldLeft
foldRight
reduce聚合
aggreate 先局部聚合再全局聚合
zip 拉链
sum 求和
Set
无序的,不重复的集合
Set不可变的集合
val l5 = collection.mutable.HashSet(2,3,4)
HashSet是可变的集合
remove 删除元素
-= 删除元素
++ 集合相加
++= 相加并赋值
Map
不可变Map:
可变Map:
Scala的面向对象
我们要封装数据,定义模板等操作,所以我们需要面向对象。
1)scala中的单列对象
在scala当中是没有static的,scala给我们提供了单例模式的实现方法。
以上是关于Scala介绍的主要内容,如果未能解决你的问题,请参考以下文章