本文转自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”的日子相关推荐

  1. 杂项 《Scala 开发教程》实验报告

    61c02dc478e51a0828eaa771d4f943ccde528cc2.jpg Scala 开发教程.jpg Scala 基础 定义变量 # 字符串常变量 val girl = " ...

  2. DuiVision开发教程(16)-区域控件

    DuiVision的area控件(类名是CArea)可以设置区域的渐变透明度,不能响应鼠标事件,此控件的原理是画一个填充的透明度渐变矩形区域,透明度从矩形区域顶部究竟部均匀渐变. 控件的属性包含: 属 ...

  3. Android OpenGL ES 开发教程(16):Viewing和Modeling(MODELVIEW) 变换

    Viewing和Modeling 变换关系紧密,对应到相机拍照为放置三角架和调整被拍物体位置及角度,通常将这两个变换使用一个modelview 变换矩阵来定义.对于同一个坐标变换,可以使用不同的方法来 ...

  4. Scala开发入门教程

    出处:http://blog.csdn.net/mapdigit/article/details/21878083 Scala语言和其它语言比如Java相比,算是一个比较复杂的语言,它是一个面向对象和 ...

  5. Scala自学教程持续更新

    最近想转型去弄Spark,所以需要先自学一下Scala,所以就把学习过程和资料一点一点记录分享出来,持续更新. 列表: [一]Scala开发环境的搭建教程-使用IntelliJ Idea [二]Sca ...

  6. 2021年大数据常用语言Scala(九):基础语法学习 break和continue

    目录 break和continue 实现break 实现continue break和continue 在scala中,类似Java和C++的break/continue关键字被移除了 如果一定要使用 ...

  7. Scala中没有break和continue, 如何退出循环

    Java是指令式风格,Scala是函数式风格. 在Scala中,应该尽量适用循环,而是应用函数的方式来处理. Scala并没有提供break和continue语句来退出循环,那么如果我们又确实要怎么办 ...

  8. python开发之四--break和continue用法

    break 和continue的用法 一.break和continue用法介绍: 1.Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语 ...

  9. scala中的break和continue

    scala中没有像C++或者java中显示地定义break和continue这样的关键字 scala实现break: import util.control.Breaks._ breakable{// ...

最新文章

  1. Add A Qdisk After configure RHCS
  2. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用...
  3. Zookeeper的Windows安装
  4. 【微信小程序】小程序之自定义头部导航栏背景图
  5. 安装 SAP Cloud Application Programming SDK @sap/cds-dk 时报错以及解决方案
  6. 列车停站方案_4月10日零时起阜阳高铁、铁路大调图!最新列车时刻表来了!看看有没有你经常乘坐的列车?...
  7. 采样次数不同平均值不一样_不同的真石漆装饰效果也是不一样的
  8. MQTT在游戏运营发行中的实践
  9. html最小化位置不变,实现DIV相对于浏览器固定位置不变
  10. mysql where不能用聚合函数_Mysql聚合函数对where语句筛选结果的影响
  11. BASE64Encoder
  12. vue-cli 外部引入vue-router报错 Uncaught TypeError: Cannot redefine property: $router
  13. uva 11732 strcmp() Anyone?
  14. Atitit.远程文件技术 webdav ftp scp ssh-sftp http nfs smb 的区别与总结
  15. scratch高级进阶的游戏项目分享:(知识的综合应用),含项目源文件百度云盘链接
  16. centos7 elasticsearch 安装启动问题
  17. 直流电机PID控制源码c语言,51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)...
  18. 在网页中打开展示pdf文件
  19. leetcode之随心刷
  20. 银河5 号超级计算机,超级计算器前五名:中国“霸占”第一和第二【图】

热门文章

  1. 设计模式学习笔记1——类与类之间的关系
  2. 计算机硬盘无法查找文件,硬盘系统中的文件搜索技巧整理
  3. go init函数_面试录 Go语言篇 内存模型
  4. python视频教程免费 西西-Python基础教程(第2版)
  5. android 百度转码,移动端禁止百度自动转码的方法
  6. 今晚直播丨Oracle数据库之Object的Access方法和结合方法
  7. 如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)
  8. 深入解析:从源码窥探MySQL优化器
  9. 想让DBA瞬间崩溃,那就让他去做SQL性能优化
  10. WeLink的杀手锏和远程办公软件的另一面