Scala基础——常用数据类型

Posted Z_Data

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala基础——常用数据类型相关的知识,希望对你有一定的参考价值。

Scala常用数据类型

1.了解scala的数据类型

​ Scala的数据类型与Java数据类型相似,但不同于Java,Scala没有原生的数据类型。Scala的数据类型均为对象,因此通过数据类型可以调用方法。

​ 在Scala中,所有数据类型的第一个字母都必须大写

scala中常用的数据类型:

数据类型描述
Int32位有符号补码整数。数值区间为−32768~32767
Float32位IEEE754(IEEE浮点数算术标准)单精度浮点数
Double64位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,否则为00 & 1或0.&(1)
|参加运算的两个数据,按二进制位进行|运算,两位只要有一个为1则结果为10 | 1或0.|(1)
^参加运算的两个数据,按二进制位进行^运算,两位不同时结果为1,相同时结果为001或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, 67,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基础——常用数据类型的主要内容,如果未能解决你的问题,请参考以下文章

2021年大数据常用语言Scala:基础语法学习 方法

2021年大数据常用语言Scala:基础语法学习 声明变量

2021年大数据常用语言Scala(十四):基础语法学习 数组  重点掌握

Scala 基础—— 基础类型和基础操作

Scala基础语法

Scala基础部署数据类型及简单语法