文档章节

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

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

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

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 206
博文 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
43
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

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 自定义你的空间

通过对你的空间进行界面的自定义能够让你的空间更加出类拔萃。 如果你具有空间管理员权限,你可以修改你空间的颜色配色,添加你自己的空间标识,选择是否在你空间中显示边栏。或者你可以进入...

honeymose
35分钟前
1
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部