文档章节

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

柳哥
 柳哥
发布于 2014/06/07 15:38
字数 528
阅读 90
收藏 0
点赞 0
评论 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)
    }
}

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

© 著作权归作者所有

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

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

暗夜灬Duke ⋅ 2015/07/20 ⋅ 0

结构化编程:跳转控制break、continue

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

彭博 ⋅ 2012/03/09 ⋅ 0

看书 Python 源码分析笔记 (五)

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

刘军兴 ⋅ 2015/12/21 ⋅ 0

第3章 控制循环语句

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

我是小谷粒 ⋅ 03/07 ⋅ 0

PHP 04 循环结构

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

Annie可馨 ⋅ 2016/11/05 ⋅ 0

22:python中的循环控制语句

循环控制语句可以更改语句执行的顺序。Python支持以下循环控制语句: 22.1 break语句 Pythonbreak语句,就像在C语言中,打破了最小封闭for或while循环。 break语句用来终止循环语句,即循环条...

下家山 ⋅ 2017/07/19 ⋅ 0

Java关键字break和continue

break关键字 break主要用在循环语句或者switch语句中,用来跳出整个语句块。 break跳出最里层的循环,并且继续执行该循环下面的语句。 语法 break的用法很简单,就是循环结构中的一条语句: ...

易水寒丶开源 ⋅ 2015/09/28 ⋅ 0

javaScript基础(四)流程控制

javascript流程控制 流程:就是程序代码的执行顺序。 流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行。 一、顺序结构 按照书写顺序来执行,是程序中最基本的流程结构。 二、选...

曾杨 ⋅ 2013/12/28 ⋅ 0

C Primer Plus 第7章 C控制语句:分支和跳转 7.6 continue和break

7.6.1 continue语句 该语句可以用于三种循环形式。 当运行到该语句时,它将导致剩余的迭代部分被忽略,并开始下一次的迭代。 如果continue语句处于嵌套结构中,它仅仅影响它的最里层的结构。...

idreamo ⋅ 2016/06/19 ⋅ 0

for、while、until循环

简介: shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for、while和until。while循环和for循环属于“当型循环”,而until属于“直到型循环”。循...

xiangys0134 ⋅ 2017/04/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 38分钟前 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 45分钟前 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 46分钟前 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 47分钟前 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 55分钟前 ⋅ 0

Greenplum 三节点安装教程(非root用户)

Greenplum 三节点安装教程(非root用户) 环境准备 安装vmware,装三台centos 虚拟机设置: 主机名 IP 内存 硬盘 node1 Xxx1 2G 80G node2 Xxx2 2G 80G node3 Xxx3 2G 80G CSDN下载greenplum...

仔仔1993 ⋅ 56分钟前 ⋅ 0

linux 信号机制

signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协...

xxdd ⋅ 57分钟前 ⋅ 0

SpringWind

环境搭建和系统部署

颖伙虫 ⋅ 今天 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部