Scala基础——常用数据类型
Posted Z_Data
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala基础——常用数据类型相关的知识,希望对你有一定的参考价值。
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个数据字段,分别为编号、号码段、省份、市、号码类型、区号和邮编,如下表。通过这份文件的数据可以查询特定手机号码的类型,统计某个地区的号码段个数,查询某个地区的所有号码段或查询手机号码的归属地等。
1,1300000,山东,济南,中国联通,0531,250000
2,1300001,江苏,常州,中国联通,0519,213000
3,1300002,安徽,巢湖,中国联通,0565,238000
4,1300003,四川,宜宾,中国联通,0831,644000
5,1300004,四川,自贡,中国联通,0813,643000
【例】实现手机号码类型识别,首先用数组存储各种类型的手机号码段,并编写一个函数识别手机号码类型。
用数组分别存储各种类型的手机号码段
编写一个函数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”的手机号号码类型
2021年大数据常用语言Scala:基础语法学习 方法
目录
方法
一个类可以有自己的方法,scala中的方法和Java方法类似。但scala与Java定义方法的语法是不一样的。
定义方法
语法
def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {
// 方法体:一系列的代码
}
[!NOTE]
- 参数列表的参数类型不能省略(因为之前定义变量的时候可以省略, 这里不要混淆了,因为变量给了初始值,可以根据初始值推断类型)
- 返回值类型可以省略,由scala编译器自动推断
- 返回值可以不写return,默认就是{}块表达式的值
示例
定义一个方法,实现两个整形数值相加,返回相加后的结果
调用该方法
参考代码
scala> def add(a:Int, b:Int) = a + b
m1: (x: Int, y: Int)Int
scala> add(1,2)
res10: Int = 3
返回值类型推断
scala定义方法可以省略返回值,由scala自动推断返回值类型。这样方法定义后更加简洁。
[!DANGER]
定义递归方法,不能省略返回值类型
因为, 递归调用是一层一层向内走, 当前那一层无法推断返回类型, 会导致一系列问题.
示例
定义递归方法(求阶乘)
比如求10的阶乘
10 * 9 * 8 * 7 * 6 * ... * 1
参考代码
scala> def m2(x:Int) = {
| if(x<=1) 1
| else m2(x-1) * x
| }
<console>:13: error: recursive method m2 needs result type
else m2(x-1) * x
以上是关于Scala基础——常用数据类型的主要内容,如果未能解决你的问题,请参考以下文章