文档章节

内建控制结构之不再使用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
第3章 控制循环语句

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

我是小谷粒
03/07
0
0
看书 Python 源码分析笔记 (五)

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

刘军兴
2015/12/21
78
0
PHP 04 循环结构

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

Annie可馨
2016/11/05
5
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部