Scala(一):概述&变量&流程控制(转载)

2023-11-17

文章目录

一、简介
    1.1 scala语言的特点
    1.2 第一个scala程序
二、变量
    2.1 Scala变量的使用
    2.2 Scala数据类型
    2.3 值类型转换
三、循环控制
    3.1 分支控制if-else
    3.2 for循环控制

Spark—新一代内存级大数据计算框架,是大数据处理的重要框架。Spark就是使用Scala编写的。因此为了更好的学习Spark,需要掌握Scala这门语言

一、简介
1.1 scala语言的特点

Scala是一门以JVM为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言
Scala是一门多范式的编程语言,支持面向对象和函数式编程
Scala可以说是源于Java,Scala源代码会被编译成Java字节码,然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接
Scala方法由一条条语句构成,每个语句后不需要分号
Scala简洁高效

1.2 第一个scala程序

object Hello {
def main(args: Array[String]): Unit = {
println(“Hello World”)
}
}

说明:
scala在编译源码时,会生成两个字节码文件,静态main方法执行另一个字节码文件中成员main方法。

scala是完全面向对象的语言,没有静态语法,只能通过模拟生成静态方法

Hello$类的对象称之为“伴生对象”。伴生对象中的内容,都可以通过类名访问来模拟java中的静态语法。伴生对象的语法规则:使用object声明。
在这里插入图片描述
另外:

scala中没有public关键字,默认所有的访问权限都是公共的;scala中没有void关键字,采用特殊的对象模拟:Unit;scala中声明方法采用关键字def。

scala中参数列表的声明方式和java不一样。java : 类型参数名;scala:参数名:类型。

java中方法的声明和方法体直接连接;scala中方法的声明和方法体是通过等号连接。

scala中将方法的返回值类型放置在方法声明的后面使用冒号连接。
二、变量
2.1 Scala变量的使用

变量声明基本语法:var | val 变量名 [: 变量类型] = 变量值,例:var num:Int=1

注意事项:

变量声明时,必须有初始值(显示初始化)
声明变量时,类型可以省略(类型推断)。类型确定后,就不能修改,说明Scala 是强数据类型语言
在声明变量时,可以使用var或者val来修饰,var修饰的变量可改变;val修饰的变量不可改变,相当于java中使用了final修饰
var修饰的引用可以改变,val修饰则不可改变,但对象的状态(值)却是可以改变的。(比如: 自定义对象、数组、集合等等)

2.2 Scala数据类型

scala数据类型分为两大类AnyVal(值类型) 和AnyRef(引用类型), 注意:不管是AnyVal还是AnyRef都是对象。
在这里插入图片描述

Unit表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()
Nothing类型在scala的类层级的最低端;它是任何其他类型的子类型
AnyRef类是scala里所有引用类(reference class)的基类

① 整型
数据类型 描述
Byte 8位有符号补码整数。数值区间为 -128 到 127
Short 16位有符号补码整数。数值区间为 -32768 到 32767
Int 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 = 2的(64-1)次方-1

scala各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证scala程序的可移植性
scala的整型默认为Int型,声明Long型变量后加l或L

② 浮点类型
数据类型 描述
Float 32 位, IEEE 754标准的单精度浮点数
Double 64 位, IEEE 754标准的双精度浮点数

与整数类型类似,scala浮点类型也有固定的表数范围和字段长度,不受具体OS的影响
scala的浮点型常量默认为Double型,声明Float后后加f或F

③ 字符类型(Char)

字符类型可以表示单个字符,字符类型是Char, 16位无符号Unicode字符(2个字节),区间值为 U+0000到U+FFFF。

字符常量是用单引号(‘ ’)括起来的单个字符。例如:var c1 = 'a‘
scala也允许使用转义字符\来将其后的字符转变为特殊字符型常量。例如:var c3 = ‘\n’
可以直接给Char赋一个整数,然后输出时,会按照对应的unicode字符
Char类型是可以进行运算的,相当于一个整数

④ 布尔类型

Boolean类型数据只允许取值true和false,只占1个字节。

⑤ Unit、Nul和Nothing
数据类型 描述
Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()
Null Null 类型只有一个实例值 null
Nothing Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。当一个函数,我们确定没有正常的返回值,可以用Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)def f1():Nothing = { throw new Exception()}

Null类只有一个实例对象null,类似于java中的null引用。null可以赋值给任意引用类型AnyRef,但是不能赋值给值类型AnyVal
Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于java里的void。Unit只有一个实例(),这个实例也没有实质的意义
Nothing可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容

2.3 值类型转换

当scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换(隐式转换 )。scala还提供了非常强大的隐式转换机制(隐式函数,隐式类,隐式值,implicity等等)。

自动类型转换细节说明:

有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
当我们把精度(容量)大 的数据类型赋值给精度(容量)小 的数据类型时,就会报错,反之就会进行自动类型转换
(byte、 short) 和char之间不会相互自动转换
byte、short、char 他们三者可以计算,在计算时首先转换为int类型
自动提升原则: 表达式结果的类型自动提升为操作数中最大的类型

强制类型转换:自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意
三、循环控制
3.1 分支控制if-else

注意事项:

如果大括号{}内的逻辑代码只有一行,大括号可以省略
scala中任意表达式都是有返回值的,也就意味着if-else表达式其实是有返回结果的,具体返回结果的值取决于满足条件的代码体的最后一行内容
scala中是没有三元运算符,可以这样简写:val result = if (flg) 1 else 0

3.2 for循环控制

scala也为for循环控制结构提供了非常多的特性

语法①

for (i <- 1 to 3) {
  println(i)//1 2 3 前后闭合
}

语法②

for (i <- 1 to 3) {
  println(i)//1 2 前闭合后开
}

循环守卫:
即循环保护式,保护式为true则进入循环体内部,为false则跳过,类似continue

for (i <- 1 to 3 if i != 2) {
  println(i) //1 3
}

引入变量:
范围后一定要加;来隔断逻辑

for (i <- 1 to 3; j = 1) {
  println(i + j)//2 3 4
}

嵌套循环:
范围后一定要加;来隔断逻辑

for (i <- 1 to 2; j <- 1 to 2) {
  println(i + "->" + j)//1->1 1->2 2->1 2->2
}

等价于:

for (i <- 1 to 2) {
  for (j <- 1 to 2) {
    println(i + "->" + j) //1->1 1->2 2->1 2->2
  }
}

循环返回值:
默认情况下for循环的返回值都是();使用yield关键字可以将每次循环的返回值放到一个Vector集合中。

val unit:Unit=for (i <- 1 to 2){
  i
}
println(unit)//()

val res = for (i <- 1 to 2) yield i * 2
println(res)//Vector(2, 4)

步长控制:

/**
* scala实现打印杨辉三角
* Range函数:前闭合后开,第三位为步长
*/
for (i <- Range(1, 18, 2)) {
  println(" " * ((18 - i) / 2) + "*" * i) 
}

中断循环:

import scala.util.control.Breaks

var sum: Int = 0
Breaks.breakable {
  for (i <- 1 to 5) {
    if (i == 3) {
      Breaks.break()
    }
    sum += i
    println(i) //1 2
  }
}
println(sum) //3

可简写为:

import scala.util.control.Breaks._

var sum: Int = 0
breakable {
  for (i <- 1 to 5) {
    if (i == 3) {
      break()
    }
    sum += i
    println(i) //1 2
  }
}
println(sum) //3

异常:

try {
      val r = 10 / 0
} catch {
      case ex: ArithmeticException=> println("捕获了除数为零的算术异常")
      case ex: Exception => println("捕获了异常")
} finally {
      // 最终要执行的代码
      println("scala finally...")
}



scala没有编译异常这个概念,异常都是在运行的时候捕获处理
用throw关键字,抛出一个异常对象。所有异常都是Throwable的子类型。throw表达式是有类型的,就是Nothing,因为Nothing是所有类型的子类型,所以throw表达式可以用在需要类型的地方
catch子句是按次序捕捉异常的
scala提供了throws关键字来声明异常

@throws(classOf[NumberFormatException])
def func() = {
“abc”.toInt
}

原文链接:https://blog.csdn.net/qq_38697437/article/details/108106078?utm_medium=distribute.pc_feed.none-task-blog-cf-2.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-cf-2.nonecase&request_id=5f43987dcea070620e93ee8c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala(一):概述&变量&流程控制(转载) 的相关文章

  • Vue Baidu Map组件封装:多边形组件和右键菜单

    在Vue上进行开发 地图使用了百度提供的Vue Baidu Map 当前版本为v0 21 15 官方文档地址 https dafrok github io vue baidu map zh index 开发需求 在百度地图上动态进行多边形的
  • 【JavaSe】高级特性篇(三) Java高级特性注解

    JavaSe 高级特性篇 三 Java高级特性注解 1 注解 Annotation 概述 1 1 定义 定义 注解 Annotation 也叫元数据 一种代码级别的说明 它是JDK1 5及以后版本引入的一个特性 与类 接口 枚举是在同一个层
  • Redis-五种数据结构

    1 五种数据结构图解如下 1 1 String数据结构 命令 get set del incr decrget set del incr decr 联想java map
  • Matplotlib绘制漂亮的饼状图

    python绘图系列文章目录 往期python绘图合集 python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取exc
  • 【满分】【华为OD机试真题2023 JAVA&JS】计算网络信号

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 计算网络信号 知识点广搜数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网
  • MISC方向MeowMeowMeow解题方法

    下载好附件后 通过好多工具都没有找到flag 突发奇想通过010工具打开MeowMeow png 发现了一堆乱码 当划到最下面的时候 发现了那些乱码有一定的规律 这个时候向上找 找到最开始出现规律的位置 会发现与题目给的flag格式CatC
  • 1001 害死人不偿命的(3n+1)猜想 (15 分)

    1001 害死人不偿命的 3n 1 猜想 15 分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1
  • 函数模板全特化与偏特化

    模板为什么要特化 因为编译器认为 对于特定的类型 如果你能对某一功能更好的实现 那么就该听你的 模板分为类模板与函数模板 特化分为全特化与偏特化 全特化就是限定死模板实现的具体类型 偏特化就是如果这个模板有多个类型 那么只限定其中的一部分
  • 7 个非常实用的 Vue.js 库

    编辑整理 杨小爱 我们在开发项目的时候 为了提升开发效率 会经常使用一些实用的开发库 而Vue js 又是前端领域中很受欢迎的框架之一 因此 就有很多开发者开发了各种实用的库 在这里 我整理了 7 个觉得好用的 Vue js 库 希望这些库
  • Acwing 795. 前缀和

    include
  • Go测试学习

    前言 textcolor Green 前言 前言 这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 从这个专栏里面可以迅速获得Go的知识 Go测试学习 03 测试 3 1 单元测试 3 1 1 单元测试 规则 3 1 2 单元测试 例
  • Linux安装Tomcat详细教程

    一 安装前提 Tomcat依赖于Java环境 所以在运行Tomcat之前 我们需要提前配置好Java环境变量 可以参考以往教程 Linux安装Java详细教程 注 Tomcat和Java使用版本最好保持一致 如果用的JDK1 8 那么最好就
  • 三维模型3DTile格式轻量化压缩模型变形浅析

    三维模型3DTile格式轻量化压缩模型变形浅析 在对三维模型进行轻量化压缩处理的过程中 常常会出现模型变形的现象 这种变形现象多数源于模型压缩过程中信息丢失或误差累积等因素 以下将对此现象进行详细分析 首先 我们需要了解三维模型轻量化压缩的
  • 有限自动机总结

    有限自动机A用来识别字符串 它由5部分组成 1 alphabet 字符集 2 states 状态集合 3 init 初始状态 4 trans s ch 状态转移函数 5 end 可接受state 集合 A str true的意思是 A可以接
  • unity中mathf.Lerp的运用

    在unity3d中经常用线性插值函数Lerp 来在两者之间插值 两者之间可以是两个材质之间 两个向量之间 两个浮点数之间 两个颜色之间 其函数原型如下 1 Material Lerp 插值 function Lerp start Mater
  • 03目标检测-传统方法与深度学习算法对比

    一 目标学习的检测方法变迁及对比 目标检测 是当前计算机视觉和机器学习领域的研究热点 从Viola Jones Detector DPM等冷兵器时代的智慧到当今RCNN YOLO等深度学习土壤孕育下的GPU暴力美学 整个目标检测的发展可谓是
  • 在SpringBoot中使用百度AI,实现通用图片识别(身份证识别也通用)

    现在网上有好多第三方使用的文章 但是没几个是可以使用的 本片文章可以放心使用哦 3 1 先去百度ai官网注册一个账号 2 选择我们需要使用的功能 3 因为我们这个是测试使用 他每天会有很多次免费使用的次数 因此完全够用 4 去领取我们需要的
  • 结巴分词jieba添加自定义词典

    结巴分词添加自定义词典 有时候很有必要 比如下面这段话 test text 我们的健康码也是绿色的 这凭什么就限制我们的就医 如果使用默认的分词 那么 健康码 这个词会分成 健康 和 码 这里可以使用词典方式 添加自定义词典 新建一个txt
  • mysql写存储过程插入数据

    DROP PROCEDURE if exists insert emps test 下面就开始创建存储过程插入数据 DELIMITER 不加这个会报错 坑了我两个小时CREATE PROCEDURE insert emps test IN
  • C#分段读取超大文本文件

    一 概述 通过C 分段读取和操作超大内存的文本文件 保证操作大于3GB的txt时内存不会爆 包括获取txt文件总行数 按行分段等 二 操作流程 1 读取文件总行数 获取txt的总行数 public int GetTunnelInfos st

随机推荐

  • 【Qt&OpenCV 图像的形态学变换 morpholgyEx】

    腐蚀用于分割 isolate 独立的图像元素 膨胀用于连接 join 相邻的元素 腐蚀 膨胀可用于去噪 低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点 图像轮廓提取 图像分割 寻找图像中的明显的极大值区域或极小值区域 高级形态学变换 开
  • react route和Switch的区别 +嵌套路由

    Router 指定路由规则 Router默认也是模糊匹配 Router的path可以不写 如果不写 表示该组件一定匹配 Switch 选择 开关 Switch中只有一个组件能匹配 只会显示第一个匹配的组件 exact 表示精确匹配
  • #QGIS源码官方编译指南

    QGIS源码官方编译指南 将QGIS官方的编译指南windows部分翻译一下 供大家参考 这个版本是QGIS源代码工程中2017年4月30日最后修改的版本 对应QGIS 2 99 也就是即将发布为QGIS 3 0的版本 翻译 Jacory
  • 计算机开机时间不对,为什么电脑每次开机时间都不对

    电脑是很智能的 一般情况下一开机电脑上面的时间就会自动校准 可有时候也会出现毛病 比如每次开机时间都不对 那么这是为什么呢 windows电脑 电脑时间不准的原因有 1 主板电池没电 2 有病毒 3 主板出问题 对应的解决方法 1 更换主板
  • 2023华为OD机试真题Java实现【寻找最大价值的矿堆/深度优先搜索】

    前言 本题使用Java实现 如果需要Python代码 请点击以下链接 点我 题目 我们规定 0表示空地 1表示银矿 2表示金矿 矿堆表示由相邻的金矿或银矿连接形成的地图 银矿价值是1 金矿价值是2 你的目标是找出地图中最大价值的矿堆 并且输
  • react页面渲染之前_React 单页面初始化渲染优化

    由于项目使用 React React Router Redux 来开发项目 采取了前端渲染的方式 如果采用 ssr 就不会有这个问题 问题 所以每到一个页面 需要发一个初始化的请求来获取页面数据 然后重新渲染页面 所以之前一个页面从请求到加
  • PP-YOLOE的译读笔记

    PP YOLOE An evolved version of YOLO 摘要 本文介绍了PP YOLOE模型 一种SOTA的产业级目标检测器 具有性能高效和部署友好的特点 本文在之前的PP YOLOv2的基础上进行优化 使用了anchor
  • linux如何脚本监控tps,Linux性能监控分析命令(三)—iostat命令介绍

    性能监控分析的命令包括如下 1 vmstat 2 sar 3 iostat 4 top 5 free 6 uptime 7 netstat 8 ps 9 strace 10 lsof 命令介绍 iostat是对系统的磁盘I O操作进行监控
  • vs中nuget包引用感叹号解决

    移除其中一个包引用 然后重新再nuget中搜索 然后在添加进来 其他的有感叹号的nuget包引用也自动刷新包了 就解决了
  • +-字符串(简单贪心)

    字符串 时间限制 1000 ms 内存限制 65535 KB 难度 1 描述 Shiva得到了两个只有加号和减号的字符串 字串长度相同 Shiva一次可以把一个加号和它相邻的减号交换 他想知道最少需要多少次操作才能把第一个字符串变换成第二个
  • python 安装第三方库imblearn

    首先把自己的numpy scikit learn scipy卸载掉 然后执行 pip install imblearn i http pypi douban com simple trusted host pypi douban com 如
  • MySQL学习笔记

    文章目录 一 数据库概述及数据准备 SQL DB DBMS 表 table SQL语句分类 导入数据 查看表结构 查看表中的数据 二 常用命令 查看MySQL版本 创建数据库 查询当前使用的数据库
  • ChatGPT/InstructGPT详解

    前言 GPT系列是OpenAI的一系列预训练文章 GPT的全称是Generative Pre Trained Transformer 顾名思义 GPT的目的就是通过Transformer为基础模型 使用预训练技术得到通用的文本模型 目前已经
  • sublime主题配色

    ignored packages Vintage theme Default Dark sublime theme dark theme Default sublime theme light theme Adaptive sublime
  • 【华为OD机试】生日礼物【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小牛的孩子生日快要到了 他打算给孩子买蛋糕和小礼物 蛋糕和小礼物各买一个 他的预算不超过x元 蛋糕cake和小礼物gift都有多种价位的可供选择 请返回小牛共有多少种
  • 【vue3】watchEffect只监听一次的方法

    import watchEffect from vue let data ref watchEffect gt console log data value 要利用data value执行的操作 而且还必须在watchEffect里面执行
  • 记录错误:con not perform the following tasks

    Ubuntu系统下安装软件出现报错 con not perform the following tasks TOC 检查软件源 实在不行改为国内源 或者等待网络再次下载
  • Bootstarp4 设计网页轮播组件

    很多网站都有广告轮播功能 可使用bootstrap4中的carousel组件非常简单的实现 目录 下载bootstrap4 轮播功能实现 简单实现轮播组件 增加标识图标 增加标题和说明 切换淡入淡出 设置数据间隔 总结 下载bootstra
  • 基于微信云开发实现电影推荐小程序

    一 项目背景 项目名称为柚子电影 此小程序的目的是为了给大家推荐电影 与其他的售票等小程序不同 二 性能需求 我的影单的增加 删除和查询 电影详情页面的完整实现 对小程序的各个方面 电影推荐 电影详情 用户授权 影院查询 影院位置 用户登录
  • Scala(一):概述&变量&流程控制(转载)

    文章目录 一 简介 1 1 scala语言的特点 1 2 第一个scala程序 二 变量 2 1 Scala变量的使用 2 2 Scala数据类型 2 3 值类型转换 三 循环控制 3 1 分支控制if else 3 2 for循环控制 S