scala表达式

1.8 表达式(重点)
# 语句(statement):一段可执行的代码
# 表达式(expression):一段可以被求值的代码,在Scala中一切都是表达式
- 表达式一般是一个语句块,可包含一条或者多条语句,多条语句使用“{}”包含,语句间以“;”分隔,称为块表达式
- 表达式有返回值

表达式和语句有什么区别:

1.表达式有返回值,语句被执行。表达式一般是一个语句块,执行后,返回一个值

scala> if(true) "true string" else "false string"
res4: String = true string
scala> if(false) 5 else "hello"
res5: Any = hello

2.不使用return语句,最后一个表达式即返回值

scala> var i=0  //可以认为是var i={0}  
i: Int = 0
​
scala> val a={ i=i+1 }  //块表达式中最后一条赋值语句返回了"()"值,它是一个Unit类型
a: Unit = ()
​
scala> val a={ i=i+1;i=i+1;i } //块表达式中最后一条语句返回i的值作为表达式的值
a: Int = 2

如果用return会发生什么?

scala> if (i>10) 100 else  -100     
scala> if (i>10) return 100 else return -100
<console>:9: error: return outside method definitionif (i>10) return 100 else return -100
1.8.1 if分支条件表达式

if-else表达式有值,这个值就是跟在if或者else之后的表达式的值。

1.单分支

基本语法

if (条件表达式) {执行代码块}

说明:当条件表达式为ture 时,就会执行 { } 的代码。

val x = 1
//如果缺失else,相当于if(x>2) 1 else ()
//返回类型是AnyVal
//如果进行类型判断和转换,可以使用:
//var b = if(m.isInstanceOf[Int]) m.asInstanceOf[Int] else 0
val m = if(x>2) 1
println(m)
​
//在scala中,每个表达式都有值,scala中有个unit类,写作(),相当于Java中的 void
val n = if(x>2) 1 else ()
println(n)

2.双分支

基本语法

if (条件表达式) {执行代码块1 } else { 执行代码块2 }

说明:当条件表达式成立,即执行代码块1,否则执行代码块2.

var x = 1
//将if/else表达式值赋给变量y
val y = if (x > 0 ) 1 else -1
println(y)

3.多分支

基本语法

if (条件表达式1) {   执行代码块1  }   
else if (条件表达式2) {  执行代码块2  }
……      
else {执行代码块n }

示例:

//if 嵌套
val  k= if(x<0) 0 else if (x>=1) 1 else -1
println(k)

混合类型表达式

//支持混合型表达式
//返回类型是Any
val z = if(x>0) "success"  else  -1
println(z)

代码

package com.qianfeng.scala
​
/*** 代码块* 1、代码块中最后一行的值作为返回值;如果最后一行为print()、赋值等语句则返回()* 2、所有代码中最后一行无需加retur语句就可以返回* 3、if() 该语句也默认有else ()*/
object Demo03_CodeBlock {def main(args: Array[String]): Unit = {//代码块val a1 = {val a = 10val b = 20a+b}println(a1)val a2 = {val a = 10val b = 20var c = 300c = a + b}println(a2)
​//if() elseval age = 17val ag1 = if(age>=18) "成年"println(ag1)val ag2 = if(age>=18) "成年" else 0println(ag2)val ag3 = if(age>=18) "成年" else {"0"println("aaa")}println(ag3)
​}
}

小结:

# 1.每个表达式都有一个类型
# 2.条件表达式有值
# 3.混合型表达式,结果是Any或者AnyVal
# 4.Scala没有switch语句,但是有更强大的模式匹配
1.8.2 循环表达式

在Scala中有for循环和while循环,用for循环比较多。

1.for循环

for循环语法结构:

for(i <- 表达式)

i <- 表达式 称为生成器,可从集合中取出每个元素。与Java类似,表达式的值必须为可遍历的迭代器Iterator[Any],包括数组、集合(Range、List、Seq……)等。以Range为例,Range表示一种区间类型,常用的两种创建方式为:tountil

val (i,j)=(1,10)
i to j      //(包含i和j)
i.to(j)
i until j   // (包含i,但不包含j) 
i.until(j)
for(n <- i to j) println(n)

for循环嵌套:for语句中可以有多个生成器

for (i <- 1 to 3; j <- 1 to 3) print ((10 * i +j) + " ")

for循环过滤器:也称循环守卫

for (i <- 1 to 3; j <- 1 to 3; if (i != j)) print ((10 * i + j) + " ")
for (i <- 1 to 3; j <- 1 to 3; if(i != j);if(j<3)) print ((10 * i + j) + " ")
for (i <- 1 to 3; j <- 1 to 3  if i != j  if j<3) print ((10 * i + j) + " ")

yield循环体:也称for推导式。Scala中的yield的主要作用是记住每次迭代中的有关值,并逐一存入到一个数组中。 用法如下:

for {子句} yield {变量或表达式}
lazy val retVal=for ( i <- 1 to 10; if i%2==0;if i>5 ) yield i
​
for(a<-retVal){println(a);
}

示例:

object ForDemo def main(args: Array[String]){//每次循环将区间的一个值赋给ifor( i <- 1 to 10)println(i)for( i <- 1 until 10)println(i)
​//for i <-数组val arr = Array("a", "b", "c")for( i <- arr)println(i)
​val s = "hello"for(i <- 0 until s.length){println(s(i))}//  或者//  for(c <- s)println(c)  //  或者//  for(i <- 0 until s.length){//  println(s.charAt(i))// }//高级for循环(嵌套循环加过滤功能)for(i <- 1 to 3 ; j<- 1 to 3 if i != j){print((10*i + j) + "")println()}//for推导式,如果for循环的循环体以yeild开始,则该循环会构建出一个集合或者数组,每次迭代生成其中一个值。val v= for ( i <- 1 to 10 )yield i*10println (v)}
}

2.while循环和do...while循环

while循环语法:

while (条件语句){表达式}

do...while循环语法

do{表达式}while(条件语句)

//求和
//while实现
val i=1     
var sum = 0
while(i<=10){sum += ii += 1
}
println(sum)
//do ... while实现
do {sum += ii += 1
}while (i>=10)

完整代码

package com.qianfeng.scala
​
/*** 循环*/
object Demo04_ForAndWhile {def main(args: Array[String]): Unit = {//单层循环for (i <- 1 to 10)print(i+"\t")
​println()for (i <- 1.until(10))print(i+"\t")println()
​
​//双重循环for (i <- 1 to 3;j <- 1 to(3))print(i*100+j+"\t")
​//双重循环,并加过滤条件;多层循环之间需要使用;分割,而条件判断部分不需要也可以println()for (i <- 1 to 3; j<-1 to 3;if(i !=j))print(i*100+j+"\t")println()
​//推倒式val res = for (i <- 1 to 10;if (i%2==0)) yield i*10for (i<-res)print(i+"\t")println()
​//集合循环for (i <- Array(1,2,5,6,3))print(i+"\t")println()
​//while循环var sum = 0while (sum < 10){sum += 1print(sum +"\t")}println()
​//do whilevar i = 0do {i += 1print(i+"|")} while (i >= 10)println()}
}

3.循环停止的三种方式

# 1.使用return
# 2.使用Boolean变量
# 3.使用breakable块

示例:

object BreakLoopDemo {def main(args: Array[String]): Unit = {//方式2 使用Boolean变量 这个方式只能使用在while或do-while中,for也行但是需要加守卫ifvar flag = truevar n = 0 //计数while(flag){  //死循环//让n自增n += 1println(n)if(n == 10){flag = false}         } //for循环版var flag1 = truefor(i <- 0 to 10 if  flag){println(i)if (i == 7){flag1 = false}}//方式3 使用breakable块//Scala中是没有break和continue关键字//想使用break,必须导入一个包//正在Scala认为位置都可以导入包   _ 相当于Java导入包是的*import  scala.util.control.Breaks._breakable{ //使用break块for(i <- 1 to 10){if( i == 7){break}}} }
}

Guff_hys_python数据结构,大数据开发学习,python实训项目-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/219344.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8深度学习的路面标志线检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Java EE 网络之网络初识

文章目录 1. 网络发展史1.1 独立模式1.2 网络互连1.3 局域网 LAN1.4 广域网 WAN 2. 网络通信基础2.1 IP 地址2.2 端口号2.3 认识协议2.4 五元组2.5 协议分层2.5.1 什么是协议分层2.5.2 分层的作用2.5.3 OSI七层协议2.5.4 TCP/IP五层协议2.5.5 网络设备所在分层 2.6 分装和分用 …

【AI基础设施】智算场景的资源管理系统与未来展望

高性能计算与智算场景 首先澄清两个概念&#xff0c;高性能计算与智算场景&#xff0c;高性能计算主要是面向天气预测、生物计算、材料计算等场景&#xff0c;而最近几年很火的智算主要是面向AI场景的计算&#xff0c;如语音识别、图像识别、自动驾驶等场景&#xff0c;我们可…

【C++11特性篇】一文助小白轻松理解 C++中的【左值&左值引用】【右值&右值引用】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.【左值&#xff06;左值引用】&…

广州华锐互动:VR煤矿特殊工种作业实训帮助提高矿工的操作技能和安全意识

VR煤矿特殊工种作业实训系统为煤矿企业培训提供了全方位的支持&#xff0c;帮助提高矿工的操作技能和安全意识&#xff0c;促进煤矿企业的安全生产。 首先&#xff0c;VR煤矿特殊工种作业实训系统可以提供逼真的虚拟操作环境&#xff0c;使矿工能够身临其境地感受各种工种的作业…

k8syaml提供的几个有意思的功能,Kubernetes在线工具网站

k8syaml.cn 提供的几个有意思的功能。 一、yaml资源快速生成 之前编写operator的helm的时候就需要自己写deployment、service、configmap这些资源&#xff0c;那么多字段也记不清&#xff0c;都是先找个模版&#xff0c;然后copy改改&#xff0c;再看官方文档&#xff0c;添加…

流程图、泳道图的介绍和示例分享,以及自定义元件库的介绍

目录 一. 流程图介绍 二. Processon使用 新建一个流程图 图形的使用 三. 流程图示例 登录界面 门诊业务流程图 住院业务流程图 药房业务流程图 会议OA流程图 四. 泳道图介绍 五. 自定义元件库 5.1 新建一个元件库 5.2 创建元件 5.3 使用自定义元件库 一. 流程图介…

初识SpringSecurity

目录 前言 特点 快速开始 导入依赖 运行项目 访问服务 权限控制 实现UserDetails接口 添加SecurityConfig配置类 测试接口DemoController 设置权限控制authorizeHttpRequests 结果分析 总结 前言 Spring Security是一个强大且高度可定制的身份验证和访问控制框架…

Openwrt源码下载出现“The remote end hung up unexpected”

最近项目原因需要下载openwrt21.02版本源码&#xff0c;花费了很多时间&#xff0c;找到正确方法后&#xff0c;发现可以节省很多时间&#xff0c;记录下过程&#xff0c;方便自己&#xff0c;可能方便他人。 一.问题阐述 openwrt21.02下载链接如下&#xff1a; git clone -…

提升数据分析效率:Amazon S3 Express One Zone数据湖实战教程

前言 什么是 Amazon S3&#xff1f;什么是 S3 Express One Zone&#xff1f;实现概述 技术架构组件实现步骤概览 第一步&#xff1a;构建数据湖的基础第二步&#xff1a;选择并查看数据集第三步&#xff1a;在 Athena 中搭建架构第四步&#xff1a;数据转换与优化第五步&#x…

Windows安装Elasticsearch并结合内网穿透实现公网远程访问

Windows安装Elasticsearch并结合内网穿透实现公网远程访问 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜…

vue3.0项目搭建

一、安装vue3脚手架 卸载vue2脚手架 npm uninstall -g vue-cli清除缓存 npm cache clen --force安装最新脚手架 npm install -g vue/cli查看脚手架版本 vue -V 二、构建项目 创建项目 vue create 项目名选择配置 自定义配置&#xff0c;回车 上下键选择Linter / Formatter&a…

《opencv实用探索·十六》opencv直方图计算calcHist函数解析

直方图理解&#xff1a; &#xff08;对于8位灰度图像亮度/灰度为(0-255)&#xff0c;12位灰度图像亮度/灰度为(0-4095)&#xff09; 以8位图像为例&#xff0c;亮度分为0到255共256个数值&#xff0c;数值越大&#xff0c;代表的亮度越高。其中0代表纯黑色的最暗区域&#xff…

外包干了3个月,技术退步明显。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

索尼(ILCE-7M3)MP4文件只能播放前两分钟修复案例

索尼的ILCE-7M3是一款经典设备&#xff0c;其HEVC编码效果是比较不错的&#xff0c;因此受到很多专业人士的青睐。之前我们说过很多索尼摄像机断电生成RSV文件修复的案例&#xff0c;今天来讲一个特殊的&#xff0c;文件已经正常封装但仅能播放前两分钟多一点的画面。 故障文件…

静态路由原理与配置

文章目录 静态路由原理与配置一、路由器的工作原理1、路由概述2、路由器的工作原理 二、路由表的形成1、路由表2、路由表的形成 三、静态路由和默认路由1、静态路由的缺点2、默认路由&#xff08;是特殊的静态路由&#xff09;3、查看路由表 四、路由器转发数据包的封装过程五、…

FreeRtos里的几个中断屏蔽

1、primask 寄存器 PRIMASK用于禁止除NMI和HardFalut外的所有异常和中断&#xff0c;使用方法&#xff1a; cpsid i &#xff1b; //设置primask &#xff08;禁止中断&#xff09; cpsie i ; //清除primask (使能中断) 也可以 movs r0,#1 msr primask r0; //将 1写入p…

力扣刷题-二叉树-二叉树左叶子之和

404 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 思路 迭代法 迭代法理解…

Java 第9章 房屋出租系统

设计 如图是系统的分层结构&#xff0c;包括了界面层、业务层和数据层。 单独建包&#xff1a;由于在实际开发过程中&#xff0c;可能会出现管理多个界面的情况&#xff0c;所以界面需要单独建包&#xff0c;其他同理。 开发任务&#xff1a;从界面层深入到业务层&#xff0c…

菜鸟学习日记(python)——匿名函数

Python 使用 lambda 来创建匿名函数。 lambda 函数是一种小型、匿名的内联函数&#xff0c;它可以具有任意数量的参数&#xff0c;但只能有一个表达式。 匿名函数的一般格式如下&#xff1a; lambda 参数列表:表达式 表达式用于计算并返回函数结果 lambda 函数通常用于编写…