文档章节

内建控制结构之不再使用break和continue

柳哥
 柳哥
发布于 2014/06/07 15:38
字数 528
阅读 92
收藏 0

Scala中没有把break与continue作为关键字,scala去掉了这些命令因为它们与函数式字面量啮合得不好。Continue在while循环中的意思很清楚,但是在函数式字面量中表示什么呢?虽然scala既支持指令式风格也支持函数式风格,但在这点上它略微倾向于函数式编程,以换取语法上的简洁性。
用if替换每个continue和用布尔变量替换每个break是最简单的方式。布尔变量用来说明while循环是否应该继续。我们来写一个java示例:

package aa;
public class Test8{
    public static void main(String[] args){
        Integer[] arr = new Integer[]{1,2,3,4,5,6,7,8,9};
        int i = 0;
        boolean b = false;
        while(i < arr.length){
            if(arr[i]%2 == 0){
                System.out.println("continue: " + arr[i]);
                i++;
                continue;
            }
            System.out.println("continue之后: " + arr[i]);
            if(arr[i]%3 == 0){
                b = true;
                System.out.println("break!!-----" + arr[i]);
                break;
            }
            i++;
        }
        System.out.println("arr[i]=" + arr[i] + "b=" + b);
    }
}

这个例子从整数数组中过滤掉所有能被2整除的数,在剩下的整数中找到一个能被3整除的数字。
如果直译成scala代,if之后的continue这块可以改写成用if包裹while余下的全部内容。要去掉break,只须增加一个布尔变量提示是否继续下去即可。如例:

package scalaTest
object Test7 {
    def main(args:Array[String]){
        val arr = Array(1,2,4,5,6,7,8,9)
        println("这个数就是: " + fun1(arr))
    }
    def fun1(arr:Array[Int]) = {
        var i = 0
        var b = false
        var c = 0
        while(i < arr.length && !b){
            if(arr(i) % 2 != 0){
                if(arr(i) % 3 == 0){
                    b = true
                    c = arr(i)
                }
            }
            i += 1
        }
        c
    }
}

结果:


我们提倡函数式风格,所以上面的代码并不完美,里面还使用了var。我们来改进一下,把循环用递归函数代替var用val代替。如例:

package scalaTest
object Test7 {
    def main(args:Array[String]):Unit = {
        val arr = Array(1,2,4,5,6,7,8,9)
        println(fun1(arr,0))
    }
    def fun1(arr:Array[Int],i:Int):Int = {    //递归函数要定义返回值类型
        if(i >= arr.length || i < 0) -999
        else if(arr(i) % 2 == 0) fun1(arr,i+1)
        else if(arr(i) % 3 == 0) arr(i)
        else fun1(arr,i+1)
    }
}

注意递归函数一定要定义返回值类型

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 0
杭州
技术主管
Python日志之Python控制流(顺序,分支,循环)

Python控制流: 所有程序都是在IDLE中运行 1.Python的三种控制流 (1).什么是控制流 Python中程序代码执行是有序的,有的代码程序会从上倒下按顺序执行,有的程序会跳转着执行,有的程序代码...

暗夜灬Duke
2015/07/20
0
0
结构化编程:跳转控制break、continue

在循环或条件判断执行中,我们有时候需要中断当前的执行控制,C#提供了两个关键字break、continue。 continue是用在循环语句中,将控制权传递给它所在的封闭迭代语句的下一次迭代。 break 语...

彭博
2012/03/09
37
0
看书 Python 源码分析笔记 (五)

第9章 Python 虚拟机中的一般表达式 这里一般表达式指对象创建语句, 打印语句等. if, while 等归为控制流语句于下一章. 简单内建对象的创建 示例 python 代码: i = 1 // int objects = "Pyt...

刘军兴
2015/12/21
78
0
第3章 控制循环语句

控制跳转语句break1.1.1 Break的使用场景和作用 break的使用场景: 在选择结构switch语句中 在循环语句中 离开使用场景的存在是没有意义的 break的作用: 跳出单层循环 1.1.2 代码案例十八 ...

我是小谷粒
03/07
0
0
PHP 04 循环结构

◆何时需要循环结构? • 循环输出一百次你好; • 将字符输出指定次数; ◆while 循环 ◆使用while 循环-1 • 打印50“次好好学习,天天向上” • 重复操作,可以使用while循环 • 使用whi...

Annie可馨
2016/11/05
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高三暑假我是怎么想开去学linux系统的

高三的时候,我有一句口头禅:“老了老了,现在做题越来越迟钝了”。当时整天日夜苦读,体重日益增加,脸色越来越黯淡,我在终于熬过了高考的时候,简直心里面乐得开了花。我终于可以去做自己...

linuxprobe16
20分钟前
0
0
Python 获得命令行参数的方法

需要模块:sys 参数个数:len(sys.argv) 脚本名: sys.argv[0] 参数1: sys.argv[1] 参数2: sys.argv[2]

编程老陆
27分钟前
0
0
链队

队列用链表来表示时,需要用两个变量来记录队列两端的变化:theFront,theBack. 根据链接方向的不同,链队有两种链接方式(其实就是链表的头插入节点和尾插入节点,头删除节点和尾删除节点)。...

Frost729
30分钟前
0
0
IDEA toString() json模板

public java.lang.String toString() {java.lang.StringBuilder builder = new java.lang.StringBuilder();#set ($i = 0)#foreach ($member in $members)#if ($i == 0)builder.appen......

Mtok
40分钟前
0
0
Dubbo内核实现之SPI简单介绍

Dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下), jdk通过ServiceLo...

明理萝
45分钟前
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部