Scala
第一章章节目标
-
掌握变量,字符串的定义和使用
-
掌握数据类型的划分和数据类型转换的内容
-
掌握键盘录入功能
-
理解Scala中的常量,标识符相关内容
1.输出语句和分句
1.1输出语句
- 方式一:换行输出
格式:println(数据)
- 方式二:不换行输出
格式:print(数据)
1.2 分号
Scala语句中,单行代码最后的分号可写可不写.如果是多行代码写在-行, 则中间的分号不能省略,最后-条代码的
分号可省略不写.
2. Scala中的常量
2.1概述
常量指的是:在程序的运行过程中,其值不能发生改变的量.
2.2分类
●字面值常量(常用的有以下几种)
。整型常量
。浮点型常量
。字符常量
。字符串常量.
。布尔常量
。空常量
●自定义常量(稍后解释)
2.3代码演示
//整型常量
println(10)
//浮点型常量
println(10.4)
//字符串常量
println('sq')
//字符常量
println('a')
//布尔常量
println(true,flase)
//空常量
println(null)
3.Scala中的变量
3.1概述
我们将来每一天编写scala程序都会定义变量, 那什么是变星,它又是如何定义的呢?
变量,指的就是在程序的执行过程中,其值可以发生改变的量.定义格式如下:
3.2语法格式
Java变量定义
int a = 0;
Scala中,可以使用val和var来定义变量,语法格式:
val/var 变量名:变量类型 = 初始值
其中
●val 定义的是不可重新赋值的变量,也就是自定义常量. .
●var 定义的是可重新赋值的变量
注意: scala中定义变量时,类型写在变量名后面
3.3 示例
需求:定义一个变量保存一个人的名字
val name: String = "tom"
name: String = tom
3.4 val和var的区别
示例
给名字重新进行赋值,观察其变化,会发现报错了
示例
用var重新定义变量来保存一个人的名字“tom”
3.5使用炎型推断来定乂変量
scala的語法要比ava筒浩,我們可以使用一-神更筒浩的方式来定乂変量。
示例
使用更筒浩的語法定乂一个変星保存一个人的名字"tom"
4. 字符串
scala提供多种定义字符串的方式,将来我们可以根据需要来选择最方便的定义方式。
●使用双引号
●使用插值表达式
●使用三引号
4.1使用双引号
语法
val/var 变量名 = "字符串"
示例
有一个人的名字叫做zhangmi,请打印出来他的名字以及名字的长度
scala> println(name + name.length)
zhangmi7
4.2 使用插值表达式
scala中,可以使用插值表达式来定义字符串,有效避免大量字符串的拼接。
语法
val/var 变量名 = s"${变量/表达式}字符串"
注意
- 在定义字符串之前添加s
- 在字符串中,可以使用${}来引用变量或者编写表达式
4.3 使用三引号
如果有大段的文本需要保存,就可以使用三引号来定义字符串。例如:保存一大段的SQL语句。三个引号中间的所
有内容都将作为字符串的值。
语法
va1/var 变量名 = """字符串1
字符串2"""
示例
定义一个字符串,保存sql代码
select
*
from
t_user
where
name = "zhangsan"
打印sql语句
4.4 拓展:惰性赋值
在企业的大数据开发中,有时候会编写非常复杂的SQL语句,这些SQL语句可能有几百行甚至上千行。这些SQL语句,如果直接加载到VM中,会有很大的内存开销,如何解决这个问题呢?
当有一些变量保存的数据较大时,而这些数据又不需要马上加载到VM内存中。就可以使用惰性赋值来提高效率。
语法格式:
lazy val/var 变量名 = 表达式
示例
在程序中需要执行一条以下复杂的SQL语询,我们希望只有用到这个SQL语句才加载它。
5. 标识符
5.1概述
实际开发中,我们会编写大星的代码,这些代码中肯定会有变量,方法,类等.那它们该如何命名呢?这就需要用
到标识符了.标识符就是用来给变量,方法,类等起名字的. Scala中的标识符和ava中的标识符非常相似.
5.2命名规则
●必须由大小写英文字母,数字,下划线_, 美元符$ ,这四部分任意组合组成.
●数字不能开头.
●不能和Scala中的关键字重名.
●最好做到见名知意.
5.3命名规范
●变量或方法:从第二个单词开始,每个单词的首字母都大写,其他字母全部小写(小驼峰命名法).
zhangSanAge,student_ Country, getSum
●类或特质(Trait): 每个单词的首字母都大写,其他所有字母全部小写(大驼峰命名法)
Person, StudentDemo, Or der It ems
●包:全部小写, -般是公司的域名反写,多级包之间用.隔开.
com. itheima.add, cn. itcast . update
6.数据类型
6.1简述
数据类型是用来约束变星(常量)的取值范围的. Scala也是一个 强类型语言,它里边的数据类型绝大多数和ava-样.
我们主要来学习
●与ava不一样的一些用法
●scala
7. 类型转换
7.1概述
当Scala程序在进行运算或者赋值动作时,范围小的数据类型值会自动转换为范围大的数据类型值,然后再进行计算.
例如:1 + 1.1的运算结果就是一个Double类型的2.1. 而有些时候,我们会涉及到一些类似于"四舍五入”的动作,要把
-个小数转换成整数再来计算.这些内容就是Scala中的类型转换.
Scala中的类型转换分为值类型的类型转换和引用类型的类型转换,这里我们先重点介绍:值类型的类型转换.
值类型的类型转换分为:
●自动类型转换
●强制类型转换
7.2自动类型转换
- 解释
范围小的数据类型值会自动转换为范围大的数据类型值,这个动作就叫:自动类型转换.
自动类型转换从小到大分别为:Byte, Short, Char -> Int -> Long -> Float -> Double
- 示例代码
va1 a:Int = 3
va1 b:Double = 3 + 2.21 //因为是int类型和doub1e类型的值进行计算,所以最终结果为: Double类型
val c:Byte = a + 1 //这样写会报错,因为最终计算结果是Int类型的数据,将其赋值Byte类型肯定不行.
7.3强制类型转换
-
解释
范围大的数据类型值通过一定的格式(强制转换函数)可以将其转换成范围小的数据类型值, 这个动作就叫:强制
类型转换.注意:使用强制类型转换的时候可能会造成精度缺失问题!
-
格式
val/var变量名:数据类型=具体的值. toXxx
//Xxx表示你要转换到的数据类型 -
参考代码
va1 a:Double = 5.21
va1 b:Int = a.toInt
7.4值类型和String类型之间的相互转换
- 值类型的数据转换成String类型
格式:
va1/var变量名:String =值类型数据+""
格式二:
val/var变量名:String =值类型数据. toString
示例
将Int, Double, Boolean类型的数据转换成其对应的字符串形式
参考代码:
va1 a1:Int = 10
val b1:Double = 2.1
va1 c1:Boolean = true
//方式一:通过和空字符串拼接的形式实现
val a2:String = al + ""
va1 b2:String = b1 + ""
val c2:String = c1 + ""
//方式二:通过toString函数实现
val a3:String = a1.toString
val b3:String = b1.toString
val c3:String = c1.toString
- String类型数据转换成其对应的值类型
格式
val/var b 变量名 = 字符串值.toXXX //XXX表示你要转换到的数据类型
注意:
- String类型的数据转换成Char类型的数据,方式有点特殊,并不是调用toChar,而是调用toCahrArray
- 这里先了解,以后再说
8. 键盘录入
8.1概述
前边我们涉及到的数据,都是我们写"死”的,固定的数据,这样做用户体验并不是特别好.那如果这些数据是由用户
录入,然后我们通过代码接收,就非常好玩儿了.这就是接下来我们要学习的Scala中的"键盘录入"功能
8.2使用步骤
1.导包.
格式: import scala.io.StdlIn
2.通过stdIn.readxxx()来接收用户键盘录入的数据
接收字符串数据: StdIn.readLine()
接收整数数据: StdIn.readInt()
8.3示例
● 提示用户录入字符串,并接收打印.
print1n("请录入一个字符串: ")
va1 str = StdIn.readLine()
print1n("您录入的字符串内容为: " + str)
●提示用户录入整数,并接收打印.
print1n("请录入一整数: ")
va1 str = StdIn.readInt()
print1n("您录入的整数内容为: " + str)
1.方法
1.1概述
实际开发中,我們需要編写大量的代码,这就勢必会渉及到重夏的需求.例如:求10和20的最大値,求11和22的最大値,像祥的需求,用来迸行比較的還輯代碕需要編写兩次,而如果把比較的還緝代碣放到方法中,只需要編写一次就可以了,文就是方法. scala中的方法和Java方法炎似,但scala与ava定乂方法的語法是不- -祥的。
1.2珸法格式
def 方法名(参数名:参数类型,参数名:参数类型) : [return type] = {
//方法体
}
注意:
- 参数列表的参数类型不能省略
- 返回值类型可以省略,由scala自动推断
- 返回值可以不写return,默认就是{}块表达式的值
1.3示例
需求
- 定义一个方法getMax,用来获取两个整型数字的最大值,并返回结果(最大值)
- 调用该方法获取最大值,并将结果打印到控制台上
参考代码
def getMax (a1: Int,a2: Int): Int{
return if(a1 > a2) a1 alse a2
}
def getMax (a1: Int,a2: Int) = if(a1 > a2) a1 alse a2
1.4返回值类型推断
scala定义方法可以省略返回值的数据类型,由scala自动推断返回值类型。这样方法定义后更加简洁。
注意: 定义递归方法,不能省略返回值类型
示例
定义递归方法,求5的阶乘.
步骤
1.定义方法factorial,用来计算某个数字的阶乘
规律: 1的阶乘等于1,其他数字的阶乘为:n!=n*(n- 1)!
2.调用方法,获取5的阶乘,并将结果打印到控制台上.
参考代码
//1.定义方法factorial, 用来计算某个数字的阶乘
def factorial(n:Int):Int = if(n == 1) 1 else n * factorial(n 一1)
//2.调用方法,获取5的阶乘.
va1 result = factorial(5)
//3.将结果打印到控制台上.
println("result: " + result)
1.5惰性方法
当记录方法返回值的变量被声明为lazy时,方法的执行将被推迟,直到我们首次使用该值时,方法才会执行,像这样
的方法,就叫:惰性方法.
注意:
- Java中并没有提供原生态的"惰性’ '技术,但是可以通过特定的代码结构实现,这种结构被称之为:懒加载(也
叫延迟加载)
- lazy不能修饰var类型的变量.
使用场景:
1.打开数据库连接
由于表达式执行代价昂贵,因此我们希望能推迟该操作,直到我们确实需要表达式结果值时才执行它
2.提升某些特定模块的启动时间.
为了缩短模块的启动时间,可以将当前不需要的某些工作推迟执行
3.确保对象中的某些字段能优先初始化
为了确保对象中的某些字段能优先初始化,我们需要对其他字段进行情性化处理
2.函数
scala支持函数式编程,将来编写Spark/Flink程序会大量使用到函数,目前,我们先对函数做一个简单入门, 在后续
的学习过程中,我们会逐步重点讲解函数的用法.
2.1定义函数
语法
(参数名:参数类型,参数名:参数类型....) =>函数体I
注意:
●在Scala中,函数是一个对象(变量)
●类似于方法,函数也有参数列表和返回值
●函数定义不需要使用def义
●无需指定返回值类型
2.2示例
需求:
1.定义一个计算两个整数和的函数
2.调用该函数
val getSum(a: Int, b:Int) => a+b
getSum
2.3方法和函数的区别
在Java中,方法和函数之间没有任何区别,只是叫法不同.但是在Scala中,函数和方法就有区别了,具体如下:
●方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中
●可以将函数对象赋值给一一个变量, 在运行时,它是加载到VM的堆内存中
●函数是一个对象,继承自FunctionN, 函数对象有apply, curried, toString, tupled这些方法。 方法则没有
结论:在Scala中,函数是对象,而方法是属于对象的,所以可以理解为:方法归属于函数.
2.4方法转换为函数
有时候需要将方法转换为函数.例如:作为变量传递,就需要将方法转换为函数
格式
val变量名=方法名_
//格式为:方法名+空格+下划线
注意: 使用二即可将方法转换为函数
示例
1.定义一个方法用来计算两个整数和
2.将该方法转换为一个函数,并赋值给变量
参考代码
def add(a:Int ,b:Int) a+b
val getSum = add_
val sum = getSum(10,20)