scala常用数据类型
1.了解scala的数据类型
scala的数据类型与java数据类型相似,但不同于java,scala没有原生的数据类型。scala的数据类型均为对象,因此通过数据类型可以调用方法。
在scala中,所有数据类型的第一个字母都必须大写
scala中常用的数据类型:
数据类型 | 描述 |
---|---|
int | 32位有符号补码整数。数值区间为−32768~32767 |
float | 32位ieee754(ieee浮点数算术标准)单精度浮点数 |
double | 64位ieee754(ieee浮点数算术标准)双精度浮点数 |
string | 字符序列,即字符串 |
boolean | 布尔值,true或false |
unit | 表示无值,作用与java中的void一样,是不返回任何结果的方法的结果类型。unit只有一个实例值,写成() |
-
scala会区分不同类型的值,并且会基于使用值的方式确定最终结果的数据类型,这称为类型推断。
-
scala使用类型推断可以确定混合使用数据类型时最终结果的数据类型。
如在加法中混用int和double类型时,scala将确定最终结果为double类型,如下图。
2.定义与使用常量、变量
在scala中,使用val关键字定义一个常量,使用var关键字定义一个变量。
1.常量
在程序运行过程中值不会发生变化的量为常量或值,常量通过val关键字定义,常量一旦定义就不可更改,即不能对常量进行重新计算或重新赋值。
定义一个常量的语法格式如下。
val name: type = initialization
val关键字后以依次跟着的是常量名、冒号“:”、数据类型、赋值运算符“=”和初始值。
val name:string = "zhangsan"
2.变量
变量是在程序运行过程中值可能发生改变的量。
变量使用关键字var定义。
与常量不同的是,变量定义之后可以重新被赋值。
定义一个变量的语法格式如下。
var name: type = initialization
var grade:int = 95
**注意:**变量在重新赋值时,只能将同类型的值赋值给变量。
grade = 80 #将同类型的值赋值给变量
grade = "lisi" #将不同类型的值赋值给变量,报错:数据类型错误
3.使用运算符
scala是一种面向对象的函数式编程语言,内置了丰富的运算符,包括算数运算符、关系运算符、逻辑运算符、位运算符和赋值运算符等。因为scala的运算符是函数的一种展现方式,所以scala也可以通过“值.运算符(参数)的方式使用运算符。
scala运算符如下表:
运算符 | 意义 | 示例 | |
---|---|---|---|
算术运算符 | + | 两个数相加 | 1+2或1.+(2) |
− | 两个数相减 | 1−2或1. − (2) | |
* | 两个数相乘 | 12或1.(2) | |
/ | 两个数相除 | 1/2或1./(2) | |
% | 两个数取余 | 1%2或1.%(2) | |
关系运算符 | > | 判断左值是否大于右值,是则结果为真,否则结果为假 | 1>2或1.>(2) |
< | 判断左值是否小于右值,是则结果为真,否则结果为假 | 1<2或1.<(2) | |
>= | 判断左值是否大于等于右值,是则结果为真,否则结果为假 | 1>=2或1.>=(2) | |
<= | 判断左值是否小于等于右值,是则结果为真,否则结果为假 | 1<=2或1.<=(2) | |
== | 判断左值是否等于右值,是则结果为真,否则结果为假 | 12或1.(2) | |
!= | 判断左值是否不等于右值,是则结果为真,否则结果为假 | 1!=2或1.!=(2) |
运算符 | 意义 | 示例 | |
---|---|---|---|
逻辑运算符 | && | 若两个条件成立则结果为真,否则结果为假 | 1>2 && 2>3或1>2.&&(2>3) |
|| | 若两个条件有一个成立则结果为真,否则结果为假 | 1>2 || 2>3或1>2.||(2>3) | |
! | 对当前结果取反 | !(1>2) | |
位运算符 | & | 参加运算的两个数据,按二进制位进行&运算,两位同时结果为1结果才为1,否则为0 | 0 & 1或0.&(1) |
| | 参加运算的两个数据,按二进制位进行|运算,两位只要有一个为1则结果为1 | 0 | 1或0.|(1) | |
^ | 参加运算的两个数据,按二进制位进行^运算,两位不同时结果为1,相同时结果为0 | 01或0.(1) |
运算符 | 意义 | 示例 | |
---|---|---|---|
赋值****运算符 | = | 将右侧的值赋于左侧 | val a = 2 |
+= | 执行加法后再赋值左侧 | a += 2 | |
−= | 执行减法后再赋值左侧 | a= 1 | |
*= | 执行乘法后再赋值左侧 | a *= 2 | |
/= | 执行除法后再赋值左侧 | a /= 3 | |
%= | 执行取余后再赋值左侧 | a %= 5 | |
<<= | 左移位后赋值左侧 | a <<= 2 | |
>>= | 右移位后赋值左侧 | a >>= 2 | |
&= | 按位&运算后赋值左侧 | a &= 2 | |
|= | 按位|运算后赋值左侧 | a |= 2 | |
^= | 按位^运算后赋值左侧 | a ^= 2 |
4.定义与使用数组
数组是scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。
scala定义一个数组的语法格式如下。
scala> var arr1:array[string] = new array[string](3)
arr1: array[string] = array(null, null, null)
scala> arr1(0) = "zhangsan"
scala> arr1(1) = "lisi"
scala> arr1(2) = "wangwu"
scala> println(arr1(0))
zhangsan
scala> println(arr1(1))
lisi
scala> println(arr1(2))
wangwu
# 第1种方式
var arr: array[string] = new array[string](num)
# 第2种方式
var arr:array[string] = array(元素1,元素2,…)
var arr2:array[string] = array("zhangsan","lisi","wangwu")
数组常用的方法
方法 | 描述 |
---|---|
length | 返回数组的长度 |
head | 查看数组的第一个元素 |
tail | 查看数组中除了第一个元素外的其他元素 |
isempty | 判断数组是否为空 |
contains(x) | 判断数组是否包含元素x |
scala> arr1.length
res9: int = 3
scala> arr1.head
res10: string = zhangsan
scala> arr1.tail
res11: array[string] = array(lisi, wangwu)
scala> arr1.isempty
res12: boolean = false
scala> arr1.contains("zhangsan")
res13: boolean = true
scala> arr1.contains("zhangsi")
res14: boolean = false
连接两个数组既可以使用操作符”++“,也可以使用concat()方法。
scala> val arr3 = array(1,2,3)
arr3: array[int] = array(1, 2, 3)
scala> val arr4 = array(4,5,6)
arr4: array[int] = array(4, 5, 6)
scala> val arr5 = arr3 ++ arr4
arr5: array[int] = array(1, 2, 3, 4, 5, 6)
注意:使用concat()方法需要先通过”import array._“命令导入包。
scala> import array._
import array._
scala> val arr6 = concat(arr3,arr4)
arr6: array[int] = array(1, 2, 3, 4, 5, 6,7,8,9,10)
scala可以使用range()方法创建区间数组。
scala> import array._
import array._
scala> val arr7 = range(1,10,2)
arr7: array[int] = array(1, 3, 5, 7, 9)
使用range()方法前同样需要先通过命令“import array._”导入包。
**注意:**scala默认创建的是不可变数组,创建可变数组需要导入包import scala.collection.mutable.arraybuffer
5.定义与使用函数
函数是scala的重要组成部分,scala作为支持函数式编程的语言,可以将函数作为对象。
定义函数的语法格式如下:
def functionname(参数列表): [return type] = {}
函数的定义由关键字def开始,紧接着是函数名称和可选的参数列表,其次是一个“:”和函数的返回类型,之后是赋值运算符“=”,最后是方法体。
scala> def add(a:int,b:int):int = {a + b}
add: (a: int, b: int)int
其中,参数列表中需要指定参数名称和参数类型
函数的返回类型[return type]可以是任意合法的scala数据类型
若函数无返回值,则函数的返回值类型为“unit”
也可以使用“return”关键字指明返回值类型
def add2(a:int,b:int):int = {
var sum = 0;
sum = a + b;
return sum
}
scala提供了多种不同的函数调用方式,以下是调用函数的标准格式:
functionname(参数列表)
如果函数定义在一个类中,那么可以通过“类名.方法名(参数列表)”的方式调用。
scala> :paste
// entering paste mode (ctrl-d to finish)
object test{
def addint(a:int,b:int):int = {
var sum:int = 0
sum = a + b
return sum
}
}
// exiting paste mode, now interpreting.
defined object test
scala> test.addint(10,20)
res16: int = 30
scala作为一种函数式编程语言,函数是scala语言的核心。
(1)匿名函数
匿名函数即在定义函数时不给出函数名的函数。
scala中匿名函数是使用箭头“=>”定义的,箭头的左边是参数列表,箭头的右边是表达式,表达式将产生函数的结果。
(x:int,y:int) => x + y
通常可以将匿名函数赋值给一个常量或变量,再通过常量名或变量名调用该函数。
scala> val addint = (x:int,y:int) => x + y
addint: (int, int) => int = $lambda$1293/0x000000080154c5e8@700735e2
scala> addint(11,22)
res18: int = 33
若函数中的每个参数在函数中最多只出现一次,则可以使用占位符“_”代替参数。
val addint = (_:int,_:int)
(2)高阶函数——函数作为参数
高阶函数是指操作其他函数的函数。
高阶函数可以将函数作为参数,也可以将函数作为返回值。
高阶函数经常将只需要执行一次的函数定义为匿名函数并作为参数。
一般情况下,匿名函数的定义是“参数列表=>表达式”。
由于匿名参数具有参数推断的特性,即推断参数的数据类型,或根据表达式的计算结果推断返回结果的数据类型,因此定义高阶函数并使用匿名函数作为参数时,可以简化匿名函数的写法。
(3)高阶函数——函数作为返回值
高阶函数可以产生新的函数,并将新的函数作为返回值。
scala> def addint2(f:(int,int) => int,a:int,b:int) = f(a,b)
addint2: (f: (int, int) => int, a: int, b: int)int
addint2((a:int,b:int) => a + b,10,20)
(4)函数柯里化
函数柯里化是指将接收多个参数的函数变换成接收单一参数(最初函数的第一个参数)的函数,新的函数返回一个以原函数余下的参数为参数的函数。
【例】定义高阶函数计算矩形的周长,该函数传入一个double类型的值作为参考,返回以一个double类型的值作为参数的函数。
def rectangele(length:double) = (height:double) => (length + height) * 2
val func = rectangele(4) #传入的第一个参数,并且将返回值作为参数
println(func(3)) #传入的第二个参数,返回值为矩形的周长
6.任务实现
任务背景
智能手机给人们的生活提供了便利,但也可能会给人们造成困扰。对于陌生号码的未接来电,用户拨打回去可能需要支付长途费用,甚至该号码有可能是诈骗分子的。合理使用大数据技术,能够大幅提高诈骗电话识别率,为构建和谐社会提供助力。
对于陌生号码的未接来电,用户其实可以查询该号码的归属地,我国的手机号码一般分为3种类型,即中国移动、中国联通和中国电信。每一个手机号码都有固定的分布区域,这个区域即归属地。无论号码被多少人注册或注销过,其归属地都是不变的。
在本次任务中,用户可以查询未接来电的归属地。如果未接来电号码的归属地是亲朋好友所在的城市,那么来电有可能是熟人的电话,可以拨打回去;如果不是,拨打回去则要做一定的诈骗防范措施。
一般情况下,知道手机号码的前7位数字即可查询到归属地。现有一份2020phonelocation.txt文件记录了某个年份我国的手机号码段及其归属地等相关信息,包含7个数据字段,分别为编号、号码段、省份、市、号码类型、区号和邮编,如下表。通过这份文件的数据可以查询特定手机号码的类型,统计某个地区的号码段个数,查询某个地区的所有号码段或查询手机号码的归属地等。
【例】实现手机号码类型识别,首先用数组存储各种类型的手机号码段,并编写一个函数识别手机号码类型。
用数组分别存储各种类型的手机号码段
编写一个函数identify识别手机号码类型,并且使用函数查询“133”的手机号号码类型
def identify(x:int) = {
if(yidong.contains(x)){
println("这个号码字段属于中国移动")
}else if(liantong.contains(x)){
println("这个号码字段属于中国联通")
}else if(dianxin.contains(x)){
println("这个号码字段属于中国电信")
}else{
println("这个号码字段不属于国内号码")
}
}
查询“133”的手机号号码类型
发表评论