Scala开发教程(16): 没有“break”和“continue”的日子
本文转自http://www.imobilebbs.com/wordpress/archives/4851,所有权利归原作者所有。
你也许注意到到目前为止,我们介绍Scala的内置的控制结构时,没有提到使用break,和continue。Scala特地没有在内置控制结构中包含break和continue是因为这两个控制结构和函数字面量有点格格不入,函数字面量我们将在后面介绍,函数字面量和其它类型字面量,比如数值字面量 4,5.6相比,他们在Scala的地位相同。
我们很清楚break,和continue在循环控制结构中的作用,Scala内置控制结构特地去掉了break和continue,是为了更好的适应函数化编程。不同你不用担心,Scala提供了多种方法来替代break和continue的作用。
一个简单的方法是使用一个if语句来代替一个continue,使用一个布尔控制量来去除一个break。比如下面的Java代码使用continue和break在循环结构中:
1
|
int i= 0 ;
|
2
|
boolean foundIt= false ;
|
3
|
while (i <args.length) {
|
4
|
if (args[i].startWith( "-" )) {
|
5
|
i=i+ 1 ;
|
6
|
continue ;
|
7
|
}
|
8
|
if (args[i].endsWith( ".scala" )){
|
9
|
foundIt= true ;
|
10
|
break ;
|
11
|
}
|
12
|
i=i+ 1 ;
|
13
|
}
|
这段Java代码实现的功能是从一组字符串中寻找以“.scala”结尾的字符串,但跳过以“-”开头的字符串。
下面我们使用if和boolean变量,逐句将这段实现使用Scala来实现(不使用break和continue)如下:
1
|
var i= 0
|
2
|
var foundIt= false
|
3
|
while (i < args.length && !foundIt) {
|
4
|
if (!args(i).startsWith( "-" )) {
|
5
|
if (args(i).endsWith( ".scala" ))
|
6
|
foundIt= true
|
7
|
}
|
8
|
i=i+ 1
|
9
|
}
|
可以看到,我们使用if (于前面continue条件相反)去掉了continue,而重用了foundIt布尔变量,去掉了break。
这段代码和前面Java实现非常类似,并且使用了两个var变量,使用纯函数化编程的一个方法是去掉var变量的使用,递归函数(回溯函数)的使用是通常使用的一个方法来去除循环结构中使用var变量。
使用递归函数重新实现上面代码实现的查询功能:
1
|
def searchFrom(i:Int) : Int =
|
2
|
if ( i >= args.length) - 1
|
3
|
else if (args(i).startsWith( "-" )) searchFrom (i+ 1 )
|
4
|
else if (args(i).endsWith( ".scala" )) i
|
5
|
else searchFrom(i+ 1 )
|
6
|
7
|
val i = searchFrom( 0 )
|
在函数化编程中使用递归函数来实现循环是非常常见的一种方法,我们应用熟悉使用递归函数的用法。
如果你实在还是希望使用break,Scala在scala.util.control包中定义了break控制结构,它的实现是通过抛出异常给上级调用函数,有希望的可以参考Scala源码,下面给出使用break的一个例子,不停的从屏幕读取一个非空行,如果用户输入一个空行,则退出循环。
1
|
import scala.util.control.Breaks._
|
2
|
import java.io._
|
3
|
4
|
val in = new BufferedReader( new InputStreamReader(System.in))
|
5
|
6
|
breakable {
|
7
|
while ( true ) {
|
8
|
println( "? " )
|
9
|
if (in.readLine()== "" ) break
|
10
|
}
|
11
|
}
|
Scala开发教程(16): 没有“break”和“continue”的日子相关推荐
- 杂项 《Scala 开发教程》实验报告
61c02dc478e51a0828eaa771d4f943ccde528cc2.jpg Scala 开发教程.jpg Scala 基础 定义变量 # 字符串常变量 val girl = " ...
- DuiVision开发教程(16)-区域控件
DuiVision的area控件(类名是CArea)可以设置区域的渐变透明度,不能响应鼠标事件,此控件的原理是画一个填充的透明度渐变矩形区域,透明度从矩形区域顶部究竟部均匀渐变. 控件的属性包含: 属 ...
- Android OpenGL ES 开发教程(16):Viewing和Modeling(MODELVIEW) 变换
Viewing和Modeling 变换关系紧密,对应到相机拍照为放置三角架和调整被拍物体位置及角度,通常将这两个变换使用一个modelview 变换矩阵来定义.对于同一个坐标变换,可以使用不同的方法来 ...
- Scala开发入门教程
出处:http://blog.csdn.net/mapdigit/article/details/21878083 Scala语言和其它语言比如Java相比,算是一个比较复杂的语言,它是一个面向对象和 ...
- Scala自学教程持续更新
最近想转型去弄Spark,所以需要先自学一下Scala,所以就把学习过程和资料一点一点记录分享出来,持续更新. 列表: [一]Scala开发环境的搭建教程-使用IntelliJ Idea [二]Sca ...
- 2021年大数据常用语言Scala(九):基础语法学习 break和continue
目录 break和continue 实现break 实现continue break和continue 在scala中,类似Java和C++的break/continue关键字被移除了 如果一定要使用 ...
- Scala中没有break和continue, 如何退出循环
Java是指令式风格,Scala是函数式风格. 在Scala中,应该尽量适用循环,而是应用函数的方式来处理. Scala并没有提供break和continue语句来退出循环,那么如果我们又确实要怎么办 ...
- python开发之四--break和continue用法
break 和continue的用法 一.break和continue用法介绍: 1.Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语 ...
- scala中的break和continue
scala中没有像C++或者java中显示地定义break和continue这样的关键字 scala实现break: import util.control.Breaks._ breakable{// ...
最新文章
- Add A Qdisk After configure RHCS
- Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用...
- Zookeeper的Windows安装
- 【微信小程序】小程序之自定义头部导航栏背景图
- 安装 SAP Cloud Application Programming SDK @sap/cds-dk 时报错以及解决方案
- 列车停站方案_4月10日零时起阜阳高铁、铁路大调图!最新列车时刻表来了!看看有没有你经常乘坐的列车?...
- 采样次数不同平均值不一样_不同的真石漆装饰效果也是不一样的
- MQTT在游戏运营发行中的实践
- html最小化位置不变,实现DIV相对于浏览器固定位置不变
- mysql where不能用聚合函数_Mysql聚合函数对where语句筛选结果的影响
- BASE64Encoder
- vue-cli 外部引入vue-router报错 Uncaught TypeError: Cannot redefine property: $router
- uva 11732 strcmp() Anyone?
- Atitit.远程文件技术 webdav ftp scp ssh-sftp http nfs smb 的区别与总结
- scratch高级进阶的游戏项目分享:(知识的综合应用),含项目源文件百度云盘链接
- centos7 elasticsearch 安装启动问题
- 直流电机PID控制源码c语言,51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)...
- 在网页中打开展示pdf文件
- leetcode之随心刷
- 银河5 号超级计算机,超级计算器前五名:中国“霸占”第一和第二【图】