Scala中没有把break与continue做为关键字,scala去掉了这些命令由于它们与函数式字面量啮合得很差。Continue在while循环中的意思很清楚,可是在函数式字面量中表示什么呢?虽然scala既支持指令式风格也支持函数式风格,但在这点上它略微倾向于函数式编程,以换取语法上的简洁性。
用if替换每一个continue和用布尔变量替换每一个break是最简单的方式。布尔变量用来讲明while循环是否应该继续。咱们来写一个java示例: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) } }
注意:递归函数必定要定义返回值类型
函数