开发者学堂课程【Scala 核心编程-基础:实现 Break 和 Continue】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8925
实现 Break 和 Continue
目录
一、讲解作业
二、while 循环的中断
三、如何实现 Continue 的效果
四、补充 Break 细节
一、讲解作业
有三个题目
1.100以内的数求和,求出当和第一次大于20的当前数【for】
2.实现登录验证,有三次机会,如果用户名为“张无忌”,密码“888”提升登录成功,否则提示还有几次机会,请使用 for 循环完成。
3.某人有100000元,每经过一次路口,需要交费,规则如下:
(1)当现金>50000时,每次交5%
(2)当现金<=50000时,每次交1000
编程计算该人可以经过多少路口,使用方式完成
第二题和第三题在做 Java 的时候已经讲过,现在就可以把以前 Java 写过的代码改成 Scala。
比如说做第一道题的时候,它会使用到 Break 的效果。
二、while 循环的中断
1.基本说明
Scala 内置控制结构特地去掉了 break 和 continue,是为了更好的适应函数化编程,推荐使用函数式的风格解决break和 continue 的功能,而不是一个关键字。
2.为什么去掉 break 和 continue
因为 Scala 设计者马丁,他认为 break 和 continue 不属于 oop 的一个范畴;他认为这个关键字它既不是 opp 的,也不是函数式变成的。因此,他就把这两个关键字拿掉了。拿掉了之后它使用函数式的
3.while 循环的中断说明
这里虽然写的是 while 循环的中断,但是这个效果也可以使用在 dowhile 或者是 for 循环。
一种风格来实现 break 和 continue 的效果。主要就是 break 就是 break,而不是一个关键字。
4.案例演示
(1)原代码
import util.control.Break._
var n = 10
breakable{
while(n <=20) {
n += 1
if(n == 18) {
braek()
}
}
(2)讲解代码
var n = 10是一个变量
其中有一个 while 循环
while(n <=20) {
n += 1
if(n == 18) {
braek()
}
在while循环里面对循环变量 n 不停地对+1
+1完了之后,如果发现 n == 18,它就调用了一个 braek 函数
braek 函数的作用是抛出一个异常,这个异常会被 breakable 进行一个处理
(3)书写代码
创建一个包:break 不能直接作为包名
创建一个名为 mybraek 的包
package com.atguigu.chaper04.mybreak
import util.control.Breaks._
object WhileBreak {
def main(args:Array[String]): Unit = {
var n = 1
//输入代码
while (n <= 20) {
//如果 n<= 20就要进入 while 循环里面去
n += 1
//每进一次,就让 n+1
//加完之后就做一个判断
println("n=" + n)
if (n == 18) {
//如果 n=18
//中断 while 循环
//说明
//1.在 scala 中使用函数式的 break 函数中断循环
//2.def braeak(): Nothing = { throw braeakException }
braeak()
//前面需要引入 import util.control.Break._
点开 braeak
def braeak()是一个函数-def 是函数的关键字
这里其实是扔出去了一个异常
如果出现 Nothing 就说明这一个函数就是一个非正常的中断或者是一个非正常的执行
这里就是用 def braeak(): Nothing = { throw braeakException }抛出一个异常
}
}
//如果在这里增加 ok~~
println("ok~~")
}
执行
因为在代码里面是 n+1,所以开始就是 n=2开始,一直到 n=18。再抛出一个异常 Exception in thread "main" scala.util.control.BreakControl
抛出异常之后,因为没有处理异常,所以 ok~~没有被输出,因为程序异常而中断了。
这样就引出了让代码继续执行
(4)breakable
import util.control.Breaks._
object WhileBreak {
def main(args:Array[String]): Unit = {
var n = 1
//breakable()函数
//添加 breakable 函数的时候,这里有一个参数 op: => Unit
//这里 breakable 是一个高阶函数,正常情况下,需要把 breakable 后面代码全部包起来:breakable 后面是一个(),breakable 是(,)放在代码最后
//包起来之后。做一个说明
//说明
//1.breakable 是一个高阶函数:可以接收函数的函数就是高阶函数(后面详解)
//2.def breakable (op: => Unit0) {
def breakable (op: => Unit0)
是一个函数
op 是函数代表的名称,如果 op:后面没有值就代表它接收的是一个没有输入(没有形参、没有返回值)的函数
//点开 breakable,出现下图
//将图中代码移动到本代码中
//def breakable (op: => Unit0)
//try {
//op
//} catch {
//case ex: BreakControl =>
//if (ex ne breakException) throw ex
//}
//}
//将图中代码注释(前面全部加//)
//(1)op: => Unit0 表示接收的参数是一个没有输入,也没有返回值的函数
//(2)既可以简单理解可以接收一段代码块
//相当于 breakable 把后面的代码作为一个代码块全部传给了 op
//3.breakable 对 break()抛出的异常做了处理,代码就可以继续执行
//4.但我们传入的是代码块,scala 程序员会将()改成[]
//所以 println("ok~~")就会正常输出
breakable(
while (n <= 20) {
n += 1
println("n=" + n)
if (n == 18)
//中断 while 循环
//说明
//1.在 scala 中使用函数式的 break 函数中断循环
//2.def braeak(): Nothing = { throw braeakException }
braeak()
println("ok~~")
}
}
执行
ok~~就执行出来了
(5)完整代码输出
import util.control.Breaks._
object WhileBreak {
def main(args:Array[String]): Unit = {
var n = 1
//breakable()函数
//说明
//1.breakable 是一个高阶函数:可以接收函数的函数就是高阶函数(后面详解)
//2.def breakable (op: => Unit0) {
//def breakable (op: => Unit0)
//try {
//op
//} catch {
//case ex: BreakControl =>
//if (ex ne breakException) throw ex
//}
//}
//(1)op: => Unit0 表示接收的参数是一个没有输入,也没有返回值的函数
//(2)既可以简单理解可以接收一段代码块
//3.breakable 对 break()抛出的异常做了处理,代码就可以继续执行
//4.但我们传入的是代码块,scala 程序员会将()改成[]
breakable(
while (n <= 20) {
n += 1
println("n=" + n)
if (n == 18)
//中断 while 循环
//说明
//1.在 scala 中使用函数式的 break 函数中断循环
//2.def braeak(): Nothing = { throw braeakException }
braeak()
}
}
println("ok~~")
}
}
三、如何实现 Continue 的效果
1.说明
Scala 内置控制结构特地也去掉了 continue,是为了更好的适应函数化编程,可以使用 if-else 或是循环守卫实现continue 的效果。
2.案例
for(i<-1 to 10 if (i != 2 && i != 3)) {
println("i=" +i)
}
3.代码
package com.atguigu.chapter04.mycontinue
object ContinueDemo {
def main(args: Array[String]):Unit = {
//说明
//1. 1 to 1.
//2.循环守卫 if (i != 2 && i != 3)这个为真,才执行循环体
//即当 i == 2 或者 i == 3时,就跳过
for(i<-1 to 10 if (i != 2 && i != 3)) {
println("i=" +i)
}
}
执行
2和3就跳过了
其他形式
println("=============================")
for(i<-1 to 10) {
if (i != 2 && i != 3) {
println("i=" +i)
}
}
执行效果一样
四、补充 Break 细节
braeak()
}
}
println("ok~~")
//注意 break 函数,可以使用再 for 或者 do..while
breakable
for (i <- 1 to 100) {
println("i=" + i)
if (i == 20 ) {
}
}
}
println("ok2~~~~")
}
}
执行
i 不停地找,就找到了 ok~~
然后继续找到20,找到20之后,就 break