分享一份B站教学视频的原笔记
传送门:Scala快速入门(适合为学Spark学习Scala的同学)
原版word文档下载:https://download.csdn.net/download/Yang_Ke_Di/33023205
以下为源文档内容
Scala
学习目标
1.能够安装上scala必备的开发工具IDEA
2.了解学习scala的必要性
3.了解函数式编程的特点
4.掌握scala编程基础
学习建议:
每一个例子都要手动去敲
Scala介绍
- Scala是一种针对JVM 将面向函数和面向对象技术组合在一起的编程语言。Scala编程语言近来抓住了很多开发者的眼球。它看起来像是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。Scala融汇了许多前所未有的特性,让开发者能够很好的而同时又运行于JVM之上。随着大数据的日益发展,scala必定会成为必不可少的开发语言。
- Spark1.6中使用的是Scala2.10。Spark2.0版本以上使用是Scala2.11版本。
- Scala官网6个特征。
1).Java和scala可以混编
2).类型推测(自动推测类型)
3).并发和分布式
4).特质,特征(类似java中interfaces 和 abstract结合)
5).模式匹配(类似java switch)
6).高阶函数
Scala安装使用
- windows安装,配置环境变量
首先安装jdk,推荐1.8版本
下载scala-2.11.8.msi文件解压安装即可
- 注:环境变量会自动进行安装新建SCALA_HOME
- 上个步骤完成后,编辑Path变量,在后面追加如下:
;%SCALA_HOME%\bin;%SCALA_HOME%\jre\bin
- 打开cmd,输入:scala - version 看是否显示版本号,确定是否安装成功
Linux下安装scala解压即可
- eclipse 配置scala插件(不建议)
- 下载插件(一定要对应eclipse版本下载)
Older releases of the Scala IDE for Eclipse - Scala IDE for Eclipse
- 下载好zip包后,解压如下:
- 将features和plugins两个文件夹拷贝到eclipse安装目录中的” dropins/scala”目录下。进入dropins,新建scala文件夹,将两个文件夹拷贝到“dropins/scala”下
- scala ide
下载网址:Download Scala IDE for Eclipse - Scala IDE for Eclipse
- idea 中配置scala插件
- 打开idea,close项目后,点击Configure->Plugins
- 搜索scala,点击Install安装
- 设置jdk,打开Project Structure,点击new 选择安装好的jdk路径
- 创建scala项目,配置scala sdk(Software Development Kit)
点击第三步,弹出选择SDK,点击Browse选择本地安装的Scala目录。选择system.
Scala基础
- 数据类型
- 变量和常量的声明
- 定义变量或者常量的时候,也可以写上返回的类型,一般省略,如:val a:Int = 10
- 常量不可再赋值
/** * 定义变量和常量 * 变量 :用 var 定义 ,可修改 * 常量 :用 val 定义,不可修改 */ var name = "zhangsan" println(name) name ="lisi" println(name) val gender = "m" // gender = "m"//错误,不能给常量再赋值 注意:scala有个原则就是极简原则,不用写的东西一概不写。 定义变量有两种形式 一种是像上面那样用val修饰另一种是var进行修饰 val 定义的变量不可变相当与java中的final 用表达式进行赋值 Val x=1 Val y=if(1>0) 1 else -1 混和表达式 Val a =if (x>0) 1 else “jay” 需要注意的是any是所有的父类,相当于java里的object else缺失的表达式 val p=if (x>5) 1 |
- 类和对象
- 创建类
class Person{ val name = "zhangsan" val age = 18 def sayName() = { "my name is "+ name } } |
- 创建对象
object Lesson_Class { def main(args: Array[String]): Unit = { val person = new Person() println(person.age); println(person.sayName()) } } |
- 对象中的apply方法
object中不可以传参,当创建一个object时,如果传入参数,那么会自动寻找object中的相应参数个数的apply方法。
/** |
- 伴生类和伴生对象
class Person(xname :String , xage :Int){ var name = Person.name val age = xage var gender = "m" def this(name:String,age:Int,g:String){ this(name,age) gender = g }
def sayName() = { "my name is "+ name } } object Person { val name = "zhangsanfeng"
def main(args: Array[String]): Unit = { val person = new Person("wagnwu",10,"f") println(person.age); println(person.sayName()) println(person.gender) } } |
注意点:
- 建议类名首字母大写 ,方法首字母小写,类和方法命名建议符合驼峰命名法。
- scala 中的object是单例对象,相当于java中的工具类,可以看成是定义静态的方法的类。object不可以传参数。另:Trait不可以传参数
- scala中的class类默认可以传参数,默认的传参数就是默认的构造函数。
重写构造函数的时候,必须要调用默认的构造函数。
- class 类属性自带getter ,setter方法。
- 使用object时,不用new,使用class时要new ,并且new的时候,class中除了方法不执行(不包括构造),其他都执行。
- 如果在同一个文件中,object对象和class类的名称相同,则这个对象就是这个类的伴生对象,这个类就是这个对象的伴生类。可以互相访问私有变量。
- This
Scala学习笔记——主构造器、辅助构造器与私有构造器_Machine Learning with Turing's Cat-CSDN博客_scala 主构造器
- if else
/** * if else */ val age =18 if (age < 18 ){ println("no allow") }else if (18<=age&&age<=20){ println("allow with other") }else{ println("allow self") } |
- for ,while,do…while
- to和until 的用法(不带步长,带步长区别)
/** * to和until * 例: * 1 to 10 返回1到10的Range数组,包含10 * 1 until 10 返回1到10 Range数组 ,不包含10 */
println(1 to 10 )//打印 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 println(1.to(10))//与上面等价,打印 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
println(1 to (10 ,2))//步长为2,从1开始打印 ,1,3,5,7,9 println(1.to(10, 2))
println(1 until 10 ) //不包含最后一个数,打印 1,2,3,4,5,6,7,8,9 println(1.until(10))//与上面等价
println(1 until (10 ,3 ))//步长为2,从1开始打印,打印1,4,7 在scala中,Range代表的是一段整数的范围,官方有关range的api: http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range
这些底层其实都是Range,Range(1,10,2):1是初始值,10是条件,2是步长,步长也可以为负值,递减。 until和Range是左闭右开,1是包含的,10是不包含。而to是左右都包含。 |
- 创建for循环
/** * for 循环 * */ for( i <- 1 to 10 ){ println(i) } //for循环数组 val arr=Array(“a”,”b”,”c”) for(i<-arr) println(i) |
- 创建多层for循环(高级for循环)
//可以分号隔开,写入多个list赋值的变量,构成多层for循环 //scala中 不能写count++ count-- 只能写count+ var count = 0; for(i <- 1 to 10; j <- 1 until 10){ println("i="+ i +", j="+j) count += 1 } println(count);
//例子: 打印小九九 for(i <- 1 until 10 ;j <- 1 until 10){ if(i>=j){ print(i +" * " + j + " = "+ i*j+" ")
} if(i==j ){ println() }
} |
- for循环中可以加条件判断,可以使用分号隔开,也可以不使用分号(使用空格)
//可以在for循环中加入条件判断 for(i<- 1 to 10 ;if (i%2) == 0 ;if (i == 4) ){ println(i) } |
- scala中不能使用count++,count—只能使用count = count+1 ,count += 1
- for循环用yield 关键字返回一个集合(把满足条件的i组成一个集合)
val result = for(i <- 1 to 100 if(i>50) if(i%2==0)) yield i
println(result)
- while循环,while(){},do {}while()
//将for中的符合条件的元素通过yield关键字返回成一个集合 val list = for(i <- 1 to 10 ; if(i > 5 )) yield i for( w <- list ){ println(w) } /** * while 循环 */ var index = 0 while(index < 100 ){ println("第"+index+"次while 循环") index += 1 } index = 0 do{ index +=1 println("第"+index+"次do while 循环") }while(index <100 ) |
加深练习
需求说明:定义一个数组val a1=Array(1,2,3,4,5,6,7,8,9)把其中的偶数取出。
8.懒加载
Val lazyVal={println(“I am too lazy”);1}
lazy val lazyVal={println(“I am too lazy”);1}
命令行演示
Scala方法与函数
- Scala方法的定义
- 有参方法
- 无参方法
def fun (a: Int , b: Int ) : Unit = { println(a+b) } fun(1,1)
|