当前位置: 代码网 > it编程>编程语言>Java > Scala基础(一)——常用数据类型

Scala基础(一)——常用数据类型

2024年07月28日 Java 我要评论
​在Scala中,使用val关键字定义一个常量,使用var关键字定义一个变量。1.常量​在程序运行过程中值不会发生变化的量为常量或值,常量通过val关键字定义,常量一旦定义就不可更改,即不能对常量进行重新计算或重新赋值。​定义一个常量的语法格式如下。​val关键字后以依次跟着的是常量名、冒号“:”、数据类型、赋值运算符“=”和初始值。​数组是Scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。​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个数据字段,分别为编号、号码段、省份、市、号码类型、区号和邮编,如下表。通过这份文件的数据可以查询特定手机号码的类型,统计某个地区的号码段个数,查询某个地区的所有号码段或查询手机号码的归属地等。

【例】实现手机号码类型识别,首先用数组存储各种类型的手机号码段,并编写一个函数识别手机号码类型。

用数组分别存储各种类型的手机号码段

在这里插入图片描述

编写一个函数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”的手机号号码类型
在这里插入图片描述

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com