Scala语言基础知识

简介

一句话总结,Scala是一门基于JVM的既面向函数式编程,又面向对象编程的语言。

Scala解释器

• Scala解释器是一个REPL(Read读取——Eval求值——Print打印——Loop循环)的程序。
• 本质上说,scala该解释器就是一个scala程序,读入一个scala的表达式,进行快速的编译解释执行过程,将结果打印到控制台,接着再读取下一个表达式。

变量语法格式

• 不可变的量:val 类似java中得final
• 可变的量:var
• 变量声明:变量名[: 数据类型] = 初始化值
• 其实根据函数式编程思想中,var变量是个不好的存在,Scala中推荐大家尽可能的采用val的不变量

数据类型

在这里插入图片描述

需要注意的类型:

Unit:就是java中void
Any:用于运行时(runtime),是对象的超类
AnyRef:用于定义类的超类
而对象是类实例。

流程控制语句

if表达式

基本和java中的if表达式一模一样,但是和java中也有不同之处,就在于scala中的表达式统统都有返回值,if表达式并不例外。

语句的终止

在scala中一行就是一条语句。但是有一个地方必须要使用分号,如果在一行上面有多条独立的语句无法区分的时候,此时必须要使用“;”

块表达式

Scala中的块表达式和java中的块表达式类似(构造代码块和静态代码块),都是使用一对儿{}括起来的表达式集合,可以执行多条表达式,同时,最后一个表达式,作为该块表达式的返回值存在。

输入输出

输入用readXxx,输出用println/print

while/do…while循环

注意:在scala中没有++或–,要用+=1或者-=1

for循环

○ 更类似java中的foreach循环:for(变量 <- 集合) {循环体}
○ 嵌套for循环:
§ 可以与java中类似,也可以有自己的格式,循环条件都写在一个括号里,用“;”隔开,后面还可以加条件处理。
○ yield字段
§ Yield字段主要是在for循环结构后面出现的,yield的主要作用就是来记录当前for循环中的局部变量,将该局部变量保存到一个数组或者集合结构中,在后面的编程中进行使用。
○ 循环终止方式:
§ 1.return关键字
§ 2.通过flag标志控制(最常用)
§ 3.使用scala中的breakable结构来控制循环

异常处理

Scala中的异常处理和java中的异常处理一模一样,不同之处在于try-catch的格式不一样,throw和throws是一样的。

Scala的函数

注意:

○ 1、你必须给出所有参数的类型。不过,只要函数不是递归的,你就不需要指定返回类型。Scala编译器可以通过=符号右侧的表达式的类型推断出返回类型。
○ 2、“=”并不只是用来分割函数签名和函数体的,它的另一个作用是告诉编译器是否对函数的返回值进行类型推断!如果省去=,则认为函数是没有返回值的!

一些常见的函数:

1.无返回值的函数
2.有返回值的函数
3.递归函数
4.单行函数
5.函数默认参数和带名参数
6.可变参数
7.延迟加载或懒加载lazy

数组

1.不可变数组Array
就是java中的Array
2.可变数组ArrayBuffer
就是java中的ArrayList

集合

Map

○ 和java中的Map是一样,就是一个K-V pair的映射框架,k不能重复,scala中的map同样也包含了可变和不可变之分。
不可变Map
val map = Map[String,Int]((“zs” -> 18))
可变Map
val map = mutable.Map[String,Int]((“zs” -> 18))

元祖

○ 映射是键/值对偶的集合。对偶是元组( tuple)的最简单形态,元组是不同类型的值的聚集。元组的值是通过将单个的值包含在圆括号中构成的。
○ 一句话总结,元组就是List
○ val tuple = new Tuple2String,Int 或者val t = (“zs”,18)
○ 和数组或字符串中的位置不同,元组的各组元从1开始,而不是0

Scala面向对象

• 1.类:用class关键字创建类
• 2.getter和setter:可以用单行函数,也可以用注解BeanProperty标注一个属性
• 3.构造器:分为主构造器和辅助构造器
○ 一个类有且仅有一个主构造器,在类的声明,类名和{之间
○ 用def this(参数列表)的方式定义辅助构造器,可以定义多个。第一行,必须要用this(参数列表)调用其他辅助构造器或者主构造器
○ this关键字:和java中的this一样。注意:scala中没有super关键字
• 4.嵌套类:就是内部类,和java中的概念相同
• 5.单例:因为scala中没有static关键字,要用Object来实现
• 6.伴生对象:scala提供Object的结构来实现java中静态和非静态共享的特点

Scala函数

• 1.作为值的函数:Scala中可以直接将一个函数作为值传递一个变量,传递的时候约定要在该函数后面依次加上空格和下划线。
• 2.匿名函数:和java中的匿名内部类的定义有点像,只用一次的函数,就没有必要声明一个,在用的时候直接去创建并调用即可。
• 3.带函数参数的函数(高阶函数):就是函数的参数是一个或者一些函数的函数。
• 4.参数(类型)推断:
○ 1.可以不用定义参数类型,scala可以做类型推断
○ 2.参数只有一种类型的时候,可以用"_"代替
○ 3.参数只有一个的时候,可以省略掉(),甚至可以省略通配符
• 5.常见的高阶函数
○ 1.map:对集合A中的每一个元素进行转换操作,生成一个新的集合B,集合A和集合B元素一一对应(一对一)
○ 2.foreach:遍历集合中的每一个元素
○ 3.flatmap:类似map,不同之处在于转换生成多个集合组成的一个集合(一对多)
○ 4.filter:将集合中满足条件的数据留下来,不满足条件的过滤掉,留下来生成一个新的集合
○ 5.reduce:参数是一个匿名函数,可以对集合中的元素进行汇总操作
○ 6.sortWith:排序
• 6.闭包:理解为给函数体内部可以引用到函数体外面定义的变量,定义这个函数的过程是将这个外面的变量捕获而形成一个封闭的函数
• 7.柯里化:函数有两个参数,接收第一个参数,生成另一个接收单个参数的函数
• 8.return表达式:你可以用return来从一个匿名函数中返回值给包含这个匿名函数的带名函数(如果不给出返回值的话,编译不通过)

Scala集合库

Iterable:父接口
1.Seq:Range,List,ArrayBuffer
List: head 返回列表的第一个元素
tail 返回一个由除了第一个元素外的所有元素的列表
isEmpty 列表为空,返回true,否则false
2.Set:集合,放置的元素无序,唯一。可以在SortedSet中设置一个自定义排序

Scala继承体系

• 1.扩展类:extends,可以继承父类的属性和方法,如果父类用final修饰,则不能修改
• 2.重写方法:子类覆盖父类的方法时,可以在方法前面加一个override,不加的话则会认为是一个新的方法,可会和父类已经有的方法冲突
• 3.类型检查和转换:Scala中使用isInstanceOf来进行类型检查,使用asInstanceOf进行类型转换。salaca中还提供了一种以模式匹配为基础的非常简洁的类型检查和类型转换的方法。
• 4.受保护的字段和方法:被protected修饰,只能在自身或者子类中被访问。比较特殊的是this控制范围,被修饰的字段或者方法,只能在本类或者本类的子类中被使用,不能在子类的对象中再被调用
• 5.超类的构造:
○ 在scala中构造和继承过程中,子类的辅助构造器要么调用主构造器,要么调用其它辅助构造器
○ scala中的辅助构造器,是无法直接调用父类的构造器
○ scala中的辅助构造器,只能通过主构造器间接的调用父类的构造器,也就是说只有主构造器才可以调用父类的构造器。
• 6.匿名子类:匿名子类,或者匿名内部类的使用方式,和java一模一样
• 7.抽象类:抽象类必须被abstract修饰,而方法如果没有实现,就没必要用abstract修饰
• 8.抽象字段:没有初始化的字段,就叫做抽象字段。如果一个类中,有抽象的字段,它也就是一个抽象类,并且和抽象方法一样,抽象字段前面的abstract关键也可以省略

模式匹配

概述

○ 类似java中的switch case语法,但是更加强大,除了可以对值进行匹配之外,还可以对类型进行匹配、对Array和List的元素情况进行匹配、对case class进行匹配、甚至对有值或没值(Option)进行匹配。

常见的模式匹配

○ 1.可以去模拟java中的switch case语法,用case_来代表default
○ 2.守卫:模式匹配可以有返回值
○ 3.模式中的变量:如果在case关键字后跟着一个变量名,那么匹配的表达式会被赋值给那个变量。
○ 4.类型模式:相比较于isInstanceOf和asInstanceOf而言,这种模式匹配的方式更加的简单直接。
○ 5.匹配数组、列表和元组
○ 6.样例类:Scala中提供了一种特殊的类,用case class进行声明,中文也可以称作样例类。case class其实有点类似于Java中的JavaBean的概念。即只定义field,并且由Scala编译时自动提供getter和setter方法,但是没有method
○ 7.模拟枚举:当使用样例类来做模式匹配时,如果要让编译器确保已经列出所有可能的选择,可以将样例类的通用超类声明为sealed。
○ 8.Option:Option[A]代表有值或者没有值,有两个子类Some(A),None,Some(A)代表有值,获取该值,使用some.get();None代表没有值,没有操作的api操作。这样我们就可以使用模式匹配的方式对Option进行判断处理,但是在生产更多的使用option.getOrElse来获取对应的值。

类型参数

可以理解为java中的泛型,用[]来声明
1.泛型类:在类的声明上面带有泛型,把这些类称之为泛型类
2.泛型函数:可以使用方法/函数泛型的方式来定义方法/函数,格式,就需要在函数名和参数之间使用[]来定义即可
3.类型变量界定和视图界定:scala中用[T<:父类型]的形式来界定变量,用[T<%父类型]作为视图界定
4.上下文界定:上下文界定的形式为T:M,其中M是另一个泛型类,它要求必须存在一个类型为M[T]的“隐式值”
5.协变和逆变:在scala中默认情况,泛型也是不支持协变和逆变的,我们可以通过对泛型的修饰来达到更加通用的形式。
6.类型通配符:Scala中的通配符是_

隐式转换

Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicit conversion function。它不仅能够简化程序设计,也能够使程序具有很强的灵活性定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用。
1.利用隐士函数丰富现有类库的功能
2.引入隐式转换:可以通过import手动引入隐式转换函数
3.隐式转换规则:隐式转换可以定义在目标文件当中
隐式转换函数与目标代码在同一个文件当中,也可以将隐式转换集中放置在某个包中,在使用进直接将该包引入即可

4.隐式参数:所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的,用implicit修饰的对象,即隐式值,并注入参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UAreNotMe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值