郑州网站制作费用,jsp免费建站系统,制作ppt教程视频自学,太原建设银行网站实训笔记9.12 Scala笔记一、学习Scala的目的二、Scala的基本概念2.1 JDK1.8版本的新特性2.2 Scala的运行机制 三、Scala的基本语法3.1 Scala中输出语句、键盘输入、注释语法3.1.1 Scala注释三种#xff0c;和Java一模一样的3.1.2 Scala键盘输入3.1.3 Scala输出 3.2 Scala变量和… 实训笔记9.12 Scala笔记一、学习Scala的目的二、Scala的基本概念2.1 JDK1.8版本的新特性2.2 Scala的运行机制 三、Scala的基本语法3.1 Scala中输出语句、键盘输入、注释语法3.1.1 Scala注释三种和Java一模一样的3.1.2 Scala键盘输入3.1.3 Scala输出 3.2 Scala变量和常量3.3 Scala中标识符3.4 Scala中的数据类型3.5 Scala中运算符3.5.1 算术运算符3.5.2 赋值运算符3.5.3 比较运算符3.5.4 逻辑运算符3.5.5 位运算符 3.6 Scala中流程控制3.6.1 分支流程3.6.2 循环流程 四、Scala的函数式编程4.1 函数的基本语法4.2 函数的形参列表问题4.3 函数的返回值问题4.4 函数的高阶函数4.4.1 函数当变量使用:把函数重命名了4.4.2 函数当参数来使用4.4.3 函数当作返回值来使用 4.5 函数的高级使用4.5.1 函数的闭包问题4.5.2 函数的柯里化4.5.3 递归函数4.5.4 函数的惰性加载 4.6 函数的简化操作4.6.1 声明的简化4.6.2 调用的简化一般不建议使用建议运算符的函数调用简化 五、 Scala中面向对象5.1 包和import导入5.1.1 Scala包有两种管理代码的方式5.1.2 Scala中类的导入问题import 5.2 面向对象中的类5.2.1 类的定义5.2.2 访问控制符 5.3 面向对象中类的属性5.3.1 属性5.3.2 声明语法 5.4 面向对象中类的方法5.4.1 方法5.4.2 语法 5.5 面向对象中类的代码块和内部类5.6 面向对象中类的构造器5.6.1 构造器是创建该类的实例对象的 六、Scala中集合七、Scala中的隐式转换八、Scala中_的作用 Scala笔记
一、学习Scala的目的
Spark、Kafka等相关大数据技术框架底层都是由Scala编程语言编写的Spark我们自己编写分布式程序时Spark提供了多种编程语言风格但是我们比较常用的是使用Scala编程。
二、Scala的基本概念
Scala是一门多范式编程语法所谓多范式指的就是多种编程风格的语法Scala主要是一门面向对象编程语言和函数式编程语言。
Scala的发明人是马丁奥德斯基Scala语言2001年左右诞生的融合了Java和JS中很多特性。
同时Java中很多特性也是从Scala语言中吸收到JDK8.0版本拉姆达表达式就是从Scala中吸收到
2.1 JDK1.8版本的新特性 Java中函数编程式接口、拉姆达表达式、方法引用 接口的组成、时间日期类、Stream API、Optional类解决NullPonitException的 Java中的拉姆达λ表达式是和Java中的一个接口紧密相关的接口函数式编程接口接口中只有一个抽象方法 语法(形参列表)- {方法体;} package lambda;import java.io.PrintStream;public class Demo {public static void test(Flyable flyable){flyable.fly(zs);}public static void test1(A a){}/*** 使用函数式编程接口时如果我们采用匿名内部类的形式必须要去重写唯一的抽象方法而且匿名内部类最核心的也是抽象方法* 所以此时我们就是使用拉姆达表达式将匿名内部类的代码给简化了即可** (形参列表) - {方法体} 就是抽象方法的简化* param args*/public static void main(String[] args) {test(System.out::println);test(name- System.out.println(name));}
}interface A{default void run(String name){}default int call(){return 0;}
}package lambda;FunctionalInterface
public interface Flyable {void fly(String name);static int run(){ return 0;}
}拉姆达表达式的简化 形参列表的类型可以省略的因为拉姆达表达式对应的函数式编程接口的抽象方法是确定的如果参数列表只有一个 那么形参列表的()可以省略的如果方法体只有一行代码而且这一行代码没有return关键字那么方法体的{}可以省略而且这一行代码不需要加分号 Java中的方法引用相当于是拉姆达表达式的升级版本主要就是用来替换整个拉姆达表达式的当拉姆达表达式的方法体是引用了另外一个类的方法并且方法体中没有多余的代码时可以使用方法引用来简化代码
2.2 Scala的运行机制
编写xxx.scala源码文件源码文件中可以使用Scala的SDK也可以使用Java的SDK使用scalac编译xxx.scala源码文件成为Java的二进制字节码文件xxx.class使用scala命令将xxx.class加载到Java的JVM虚拟机当中运行的
三、Scala的基本语法
3.1 Scala中输出语句、键盘输入、注释语法
3.1.1 Scala注释三种和Java一模一样的
3.1.2 Scala键盘输入
直接无缝衔接使用Java的键盘输入 Scanner使用Scala提供的自带的键盘输入 StdIn.readxxx()
3.1.3 Scala输出
使用Java的输出语句 System.out.xxx普通输出print()/println()模板输出print/println(sxxxxx$变量名)占位符输出print/println(xxxxx%s %d,变量变量)
3.2 Scala变量和常量
语法 var|val 变量名|常量名【:数据类型】 初始值; 【注意】虽然Scala中数据类型可以省略但是Scala是一门强类型编程语法 3.3 Scala中标识符
Scala的标识符由字母、数字、下划线、数学符号、$美元符号组成的其中数字不能开头如果标识符以数学符号开头那么标识符中只能包含数学符号Scala标识符可以是关键字和保留字但是关键字和保留字需要使用包括
3.4 Scala中的数据类型
Scala是一门纯面向对象的编程语言因此在Scala中所有的数据类型都是对象
Scala中所有类型的顶尖父类AnyAny有两个直接子类AnyVal、AnyRef
AnyVal是值类型Byte、Short、Int、Long、Float、Double、Char、Boolean、Unit
AnyRef是引用类型Java中所有类、Scala中所有类、Scala中所有集合、Null
Unit、Null、Nothing三个比较特殊的类型
3.5 Scala中运算符
3.5.1 算术运算符
没有 –
3.5.2 赋值运算符 -…
3.5.3 比较运算符
Scala中代表比较值相等比较地址相等用eq函数
3.5.4 逻辑运算符
3.5.5 位运算符 【注意】Scala运算符本质上是一个函数函数的名字是数学符号正常情况下运算符的使用语法应该如下 1 1 1.1 函数调用的时候可以简化 函数调用的点可以省略的如果函数的参数只有一个那么()可以省略的 3.6 Scala中流程控制
顺序流程代码遵循从上而下依次执行
3.6.1 分支流程 if类型的分支Java一模一样的 模式匹配 语法 x match{ case 值|x [模式守卫if] case分支语句 case 值|x [模式守卫if] case分支语句 case _ case分支语句 }【模式守卫】模式守卫可以做范围匹配一般使用模式守卫时case需要x
3.6.2 循环流程 for循环 until型的for循环 for(i - start until end) to型的for循环 for(i - start to end) 增强的for循环——遍历集合或者数组 for(elem - 集合/数组的变量) for循环的步长迭代默认情况下迭代1 for(i - start until|to end by num) 循环守卫满足某个条件再执行循环体 for(i - start until|to end 【by num】 if 语句) 多重循环 for(i - start until|to end by num 循环守卫 j- start until|to end by num 循环守卫) 循环的返回值问题将循环的值赋予给一个Scala集合 var array for(i - start until|to end by num 循环守卫) yield i while循环 do while循环 2~3和Java语法是一模一样的
四、Scala的函数式编程
4.1 函数的基本语法
def 函数名(形参列表):函数的返回值类型{ 函数体 }
4.2 函数的形参列表问题 可变长形参 参数名:数据类型*,一个函数只能有一个可变长形参而且形参必须位于函数形参列表的末尾 形参的默认值Scala函数当中形参是可以赋予默认值的一旦形参赋予默认值那么调用参数的时候带有默认值的形参就可以不用传递参数了带有默认值的形参一般要求放到形参列表的最后如果没有放到最后那么调用的时候给其他形参传递参数需要带有参数名传递 def test(name:Stringzs,age:int){} test(age1)--具名实参
4.3 函数的返回值问题 【注意】函数有两种特殊的返回值Unit、Nothing 4.4 函数的高阶函数 【注】在Scala中函数是一等公民函数可以在Scala的任何位置充当任何的角色函数可以声明在类中也可以声明在函数中还可以声明在参数列表中、还可以当作返回值还可以当作一个变量 4.4.1 函数当变量使用:把函数重命名了
var d:函数的定义 函数名 _ 【注意】函数的类型如何声明 (形参类型列表) 返回值类型 示例
函数的定义
def test(a:Int,b:Int):Int{ab}
函数的类型写法
(Int,Int) Int
4.4.2 函数当参数来使用
语法
def test(a:Int,f:(Int,Int)Int):Unit{ }
4.4.3 函数当作返回值来使用
语法
def test():(Int,Int)Int{ } 4.4.2~4.4.3 :Scala中存在匿名函数专门使用在这两个场景 4.5 函数的高级使用
4.5.1 函数的闭包问题
函数闭包指的是将不属于本函数的变量或者对象也包含进来直到该函数运行完成外部变量或者对象才可以被释放。
var x:Int 1 def test(a:Int):Int{ a*x }
4.5.2 函数的柯里化
将一个接受多个参数的函数给他转换成为一个接受单个参数的函数的过程
将一个接受多个参数的函数转换成为一个返回了函数的函数返回的函数传递的值就是原先的第二个参数
其实闭包的一个使用场景
4.5.3 递归函数 函数内部调用本函数 递归三要素 递归入口自己调用自己的的逻辑递归出口不能调用自己的逻辑递归条件必须向出口迭代
4.5.4 函数的惰性加载
惰性加载指的是将函数的调用延迟到第一次使用函数的返回值的时候才会调用
使用语法 lazy val 变量名 函数名(实参)
此时函数的调用在第一次使用变量的时候才会调用 一旦惰性加载变量名只能使用val修饰
4.6 函数的简化操作
4.6.1 声明的简化 如果函数没有参数那么函数的括号可以省略 def test:Unit{} 函数的返回值可以省略的可以根据函数体的最后一行自动推断 【注意】如果函数体的最后一行使用return 关键字返回数据那么函数的返回值一定不能省略的 def test { 1 } 函数体中函数的返回值前的return关键字可以省略的自动根据最后一行推断函数的返回值 如果函数的返回值类型是 Unit类型 那么 号和函数 的返回值都可以省略 def test{} 匿名函数 定义定义函数时只关注函数的逻辑不关注函数的名字此时我们就可以使用匿名函数来定义函数 (形参列表) {函数体}使用场景当函数当作参数或者当作返回值使用的时候可以使用匿名函数传递简化 匿名函数的形参列表的类型可以省略的因为当作参数或者返回值使用的时候参数的类型定义死了如果匿名函数的函数体只有一个那么 {} 可以省略了如果形参的参数名在函数体中只出现了一次那么参数名就可以使用 _ 替代同时形参列表可以省略了
4.6.2 调用的简化一般不建议使用建议运算符的函数调用简化
调用的语法对象名|类名.函数名(实参列表)
调用的点.可以省略的对象名|类名 函数名(实参列表)如果实参列表为空那么 () 可以省略如果声明函数的时候没有加 () 那么调用的时候一定不能加 ()如果函数的实参列表只有一个 那么 () 也可以省略 对象名|类名 函数名 唯一的实参
五、 Scala中面向对象
Scala源于Java中因此在Scala中也存在面向对象编程思想面向对象编程最核心的逻辑就是以类来组织代码以对象来调用代码。Scala的面向对象和Java基本上思维是一致的只不过就是语法稍微不一样而已。
5.1 包和import导入
包package包是用来分类管理Scala代码的将不同类型的代码放到不同的包下便于我们管理
5.1.1 Scala包有两种管理代码的方式 采用和Java一样的管理机制,新建包包下可以新建类和子包 采用包对象的管理机制实现一个文件中存在多个包和多个scala类
5.1.2 Scala中类的导入问题import
在当前Scala类中如果要使用非本包下的代码那么我们就得需要通过import关键字导入才能使用。 每一个Scala类默认导入三个包 java.lang._scala._scala.Predef._ Scala类中导入有一些规则和Java有点不一样 Scala可以在任何位置进行导包操作代码只能在导包位置之后使用 我们可以把所有的包放到package之后 class之前 如果我们要导入一个包下的所有代码那么可以使用_当作通配符使用 我们现在只想导入某一个包下的两个类而非所有类 import xxxx.{x1,x2} 导包重命名操作可以将一个类重命名为另外一个名字在当前类中使用 import xxxx.{x1x2} x1类在当前类中可以使用x2名字来替代 屏蔽某一个包下的部分类导入一个包下的所有代码除了某几个类之外 import xxxx{x1_,x2} 导入xxxx包下的x2类不导入x1这个类
5.2 面向对象中的类
5.2.1 类的定义
访问控制修饰符 class 类名(主构造器){ 类体 }
5.2.2 访问控制符
三个 private protected public–不写 在同一个Scala文件中可以存在多个Scala类权限没要求的 5.3 面向对象中类的属性
5.3.1 属性
属性用来描述类的特征
5.3.2 声明语法
访问控制修饰符 var|val 属性名:属性类型 值;
属性声明的时候必须加值但是我不想给其他值只想给默认值那么值使用**_** 来代替 【注意】 val修饰的属性 不能赋予 _ 默认值必须给一个显示的值 属性前加一个注解BeanProperty 5.4 面向对象中类的方法
5.4.1 方法
方法就是函数函数声明在类中函数称之为方法
5.4.2 语法
访问控制修饰符 def 方法名(形参列表):方法的返回值类型 { 方法体 }
5.5 面向对象中类的代码块和内部类
{} 类中类
5.6 面向对象中类的构造器
5.6.1 构造器是创建该类的实例对象的
Scala有两种构造器 主构造器声明在类上的 class ClassName 访问控制修饰符 (形参列表)--主构造器辅助构造器声明在类中的构造器语法 def this形参列表{ }辅助构造器必须在首行直接或者间接的调用主构造器代码 【注意】 主构造器不存在构造体那么也就意味着主构造器无法给属性赋值为了可以给属性赋值主构造器的形参列表有个变化主构造器的形参列表可以使用var或者val修饰一旦主构造器的形参使用var val修饰 那么主构造器中的形参就是类的属性了 主构造器我们一般都是要求是无参构造器而且主构造器一旦是无参的那么主构造器的()可以省略 六、Scala中集合
七、Scala中的隐式转换
八、Scala中_的作用
_在模式匹配中_代表的是未匹配到其他情况默认情况函数名 _ : _ 代表的是将函数当作一个整体来使用而非调用函数