scala 简介
- 为什么要学习scala
因为spark是用scala语言编写、 - scala是什么
是结合了面向对象和函数式编程思想的一门语言 - scala适合写计算型的代码
- 是一个静态类型的语言
- Jvm类型语言
注:面向对象适合做命令式编程-流程型的代码
JDK是SDK的一种
SDK software devlpoment kit 软件开发工具箱
JDK Java devlpoment kit Java开发工具箱
OOP AOP FP 面向对象,面向切面, 函数式编程
var 变量
val 常量
lazy 延迟加载:在定义的时候是不执行的,在使用时才执行初始化
数据类型
- Any : 所有类的父类
- Nothing 所有类都的子类
- Null 所有引用类的子类
- Unit
AnyVal
(Byte,Short,Int,Long,Float,Double|Char,Boolean,Unit(空))
所有值类型的父类
AnyRef
所有引用类型的父类
————下图实线表示父子关系, ——表示隐式转换
trainl类似于接口 ,,可以让方法实现多继承 extend a with b,c,d
{} 表达式 赋值语句等等都是有返回值的
Scala编程语言不支持++ – 操作,但支持+= -=操作
定义函数方法
def m1(x:Int,Y:Int):Int = {x+y}
def 关键字,用来声明定义方法
m1 方法名称
x,y 形参
:Int) 括号内的属于参数的类型
(x:Int,y:Int参数列表
= 表示连接方法名称、参数列表以及=后的代码执行体
{} 方法体
):Int括号外的:Int表示返回值的类型
def cal(x:Int,f:(Int,Int)=>Int,y:Int)=f(x,y)
f:(Int,Int)=>Int 表示参数方法
f(x,y) 表示调用方法的格式
方法转换为函数
var function1=m1
var function1: (Int,Int)=>int=(x:Int,y:Int)=>{x+y}
var a : Int ={2+6}
纯粹的函数式编程就是调用某一个逻辑的时候,还可以传入另外一个逻辑(方法或函数)
最终结论
(方法和函数)都可以作为另外一个(方法或函数)的参数
scala练习
1 | package com.demo |
Scala集合
数组(Array)
分成两大类
- 定长数组:Array(Insert,delete是没有的,只能进行修改操作)
- 变长数组:ArrayBuffer 缓冲数组
没有指定素组长度,理论上可以无限增加元素
+= 表示追加一个元素或者多个元素
++= 表示追加一个Array或者ArrayBuffer或者其他的seq类型的实现类的对象
insert(a,b) a是位置 b是需要追加的元素
remove(a,b)a是位置, b是个数
要点
var aa=new ArrayInt
打印为:aa=new Array(0.0.0))
var aa=ArrayInt
打印为:aa=new Array(3)
var aa=Array.apply(3)
打印为:aa=new Array(3)
- 如果偶在构造数组的时候带了new表示new申请一个固定长度的数组
- 如果没有使用new,其实也在构造数组,只不过调用了Array.apply(3)
定长数组转换成变长数组
aa.Buffer
变长数组转换成定长数组
aa.toArray
数组的常用操作
集合(Seq 序列/列表,Set集合,Map映射)
Scala集合分为可变和不可变的集合
函数作为对象 可以作为参数传递–
::
+:
用于追加集合里的值,合并为一个新的集合
1 | package com.demo |
Scala Java互操作
由于Java和Scala的编译后的都是.class文件,都是通过JVM进行操作的,因此可以互相调用
Scala可以调用Java生成的类,反之亦然。使用时只要注意语法规范即可
特殊情况:
java不能使用scala的不可变集合
隐式转换
在scala中,当对象调用一个它本身并没有的方法时,编译器会从当前代码上下文中寻找拥有此方法的对象,然后在原对象的所拥有的方法中追加此方法。这个转换过程,不需要通过开发者手动操作,是编译器在背后默默地转换。因此称之为隐式转换。
这样可以再不更改原来代码的基础上,增加新的功能。提高代码的可维护性。
类似于设计模式中的代理模式。
java集合转换成scala定长集合
1 | package com.demo; |
1 | package com.demo |