1.SCALA简介:
Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。简单来说 SCALA就是一门面向函数和面向对象的混合式变成语言;
2.学习是SCALA的目的:
- 优雅:这是框架设计师第一个要考虑的问题,框架的用户是应用开发程序员,API是否优雅直接影响用户体验。
- 速度快:Scala语言表达能力强,一行代码抵得上Java多行,开发速度快;Scala是静态编译的,所以和JRuby,Groovy比起来速度会快很多。
- 能融合到Hadoop生态圈:Hadoop现在是大数据事实标准,Spark并不是要取代Hadoop,而是要完善Hadoop生态。JVM语言大部分可能会想到Java,但Java做出来的API太丑,或者想实现一个优雅的API太费劲。
- spark分布式运算框架是scala语言编写的
- 函数式编程有利于流式数据的处理
3.SCALA环境的搭建
由于scala是基于java来开发的, 编写的java类可以使用javac命令编译成.class文件被JVM加载到内存中执行 ! 那么scala可以通过scalac命令将编写的scala文件编译成.class文件一样被JVM加载到内存中,因此Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK!
3.1 windows的环境搭建
- 访问Scala官网http://www.scala-lang.org/下载Scala编译器安装包如图一
- 下载好对应的按照包之后,然后到指定目录下进行解压,然后配置scala的系统环境变量 如图二
- 在cmd中进行测试环境是否配置好,输入命令:scala-version 如图三
图一:
图二:
图三:
3.2 linux中scala的环境搭建
先将我们下载好的linux版本的scala安装包上传到linux中的指定的目录中
将安装包进行解压,解压之后在linux中配置系统环境变量 : vi /etc/profile 如图一
配置完成之后:source /etc/profile
4.scala 中的数据类型:
scala中的数据类型和java中的数据类型的区别:
scala中的数据类型和java中数据类型最大的区别就是scala中的数据类型都是对象 , 也就是scala中没有原生的数据类型!
4.1scala中的数据类型特点:
scala中的数据类型分成两类 AnyVal(值类型)和AnyRef(引用类型) , 两种对象都属于Any ,都是对象val age:Int = 23
age是一个Int数值类型的变量 , 数值类型的变量也属于一个对象 , 所以age变量就是一个对象,也拥有很多方法
- Any : 所有类型的父类 , 类似于java中的Object
- AnyVal: 数值类型(简单类型)
- AnyRef: 引用数据类型
- Null: 应用类型的子类,类似于java中的null ,是所有引用类型的子类
- Nothing: 所以类型的子类 可以返回给任意的变量或者函数 通常异常时使用,表示此处有错误
5. SCALA中对变量的定义:
var 可变的变量
val 不可变的变量 (在不改变值的情况下优先使用val)
定义变量的格式:var | val 变量名称:变量类型 = 变量值
5.1 变量定义的总结:
1)数据类型可以指定,也可以不指定,如果不指定,那么就会进行数据类型的推断。
2)如果指定数据类型,数据类型的执行 方式是 在变量名后面写一个冒号,然后写上数据类型。
3)我们的scala里面变量的修饰符一共有两个,一个是var 一个是val,如果是var修饰的变量,那么这个变量的值是可以修改的。如果是val修饰的变量,那么这个变量的值是不可以修改的。
需要注意的地方:
- val 在编程的过程中我们大部分的操作是获取值或者是获取一个创建好的对象,然后操作对象中的属性,很少改变这个对象变量
- val 是线程安全的 , 在使用的时候效率更高
- 优先使用val ,但是当变量后续的需要变化的时候使用var
6. 数据类型的转换(*****):
6.1知识点:
scala类型转换遵循的基本原则和java中的一致 , 高精度的类型转换成低精度的时候有可能出现精度丢失问题,低精度的数据可以直接隐式的转换成高精度的数据
6.2 数据类型大类型转为小类型需要强转,一般我们用到的强制类型的转换的方法为:
还有一种强制类型转换的方法:
//变量xx为Double类型,强制转换为Int类型 val xx=10.101 //xx.asInstance[要转换的类型] 方法名称 val i: Int = xx.asInstanceOf[Int]
6.3 判断一个变量的类型是否是Int或者是String,可以使用一下方法
val x=10
x.isInstanceof[要判断的类型],返回值是一个boolean类型的值 ,要有继承关系
7.流程控制语句:
1 语法:
if() {} else {} 用法和java中的语法一致
if() {} else if (){} ...else{} 和java中的用法一致
if(){ if循环的嵌套,用法和java中的一致
if(){}else{}
}
2 数组的定义
//scala中数组的定义 val arr: Array[String] = Array("java", "scala", "go", "c++")
3 数组的取值
对数组的遍历
object ArrayEach { def main(args: Array[String]): Unit = { val arr = Array("tom", "jim", "peiqi", "乔治", "nimou") 1 遍历 arr.for 回车 for (elem <- arr) { } 2 角标 for (i <- 0 to arr.length - 1) { arr(i) } 3 角标 for (i <- 0 until arr.length) { arr(i) } 4 forEach 方法是没有返回值 常用于集合打印 // arr.foreach(e=>println(e)) // e=>e _ // arr.foreach(println(_)) // arr.foreach(println) // 默认打印每个元素 //arr.foreach(e=>println(e.toUpperCase)) // 打印数据 // arr.foreach(e=>print(e+" ")) // 处理数据 var res = "" arr.foreach(e => { // =>后面的代码是每个元素执行一次 res += e + " " }) // println(res.trim) 5 map方法 方法是可以有返回值 对集合中的每个元素进行操作 arr.map(println) arr.map(println(_)) arr.map(e=>println(e)) //val res2: Array[String] = arr.map(_.toUpperCase) /*val res3: Array[Any] = arr.map(e=>{ if(e.startsWith("j")){ e.toUpperCase } })*/ /** * _ 代表每个元素 */ arr.foreach(println) arr.foreach(println(_)) arr.map(_.toUpperCase) arr.map(e => println(e)) } }
4 Random类的基本使用使用
知识点总结:
1.在scala中,类有两种类型,一种是Object类,一种是普通的class类
1.1 Object类默认是用static 修饰的,是静态的,所有的main方法是写在Object中,程序才能还行;
2.scala中行末尾的分号可以不写,这样可以体现scala语言的简洁特点
3.对于变量的定义,一般我们用val 来接收变量例如: val x="hello"
4.Nothing: 所以类型的子类 可以返回给任意的变量或者函数 通常异常时使用,表示此处有错误
5.在定义变量的时候优先使用val,但是当变量后续的需要变化的时候在使用var
6.我们一般需要对变量进行字符串的拼接,为了方便拼接,我们可以直接在字符串中进行取变量的值来拼接,方便凭接
val x="hello" val y="word" println(s"${x}${y}你好")
7. 代码块的返回值是,代码最后一行