scala开发快速入门 | 第三篇 程序控制结构

预备知识(Range)

在执行for循环时,我们经常会用到数值序列,比如,i的值从1循环到5,这时就可以采用Range来实现。Range可以支持创建不同数据类型的数值序列,包括Int、Long、Float、Double、Char、BigInt和BigDecimal等。

在创建Range时,需要给出区间的起点和终点以及步长(默认步长为1)。

(1)创建一个从1到5的数值序列,包含区间终点5,步长为1

scala> 1 to 5

res2: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

scala> 1.to(5)

res3: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)

(2)创建一个从1到5的数值序列,不包含区间终点5,步长为1

scala> 1 until 5

res7: scala.collection.immutable.Range = Range(1, 2, 3, 4)

(3)创建一个从1到10的数值序列,包含区间终点10,步长为2

scala> 1 to 10 by 2
res8: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9)
scala> 1  to (10,2)

res9: scala.collection.immutable.Range.Inclusive = Range(1, 3, 5, 7, 9)

(4)创建一个Float类型的数值序列,从0.5f到5.9f,步长为0.3f

scala> 0.5f to 5.9f by 0.8f
res10: scala.collection.immutable.NumericRange[Float] = NumericRange(0.5, 1.3, 2.1, 2.8999999, 3.6999
998, 4.5, 5.3)
scala> 0.5f to(5.9f, 0.8f)
res11: scala.collection.immutable.NumericRange.Inclusive[Float] = NumericRange(0.5, 1.3, 2.1, 2.89999

99, 3.6999998, 4.5, 5.3)

一、if语句

1)if语句

if(true){

//条件为真时执行

}

示例

scala> val x=8
x: Int = 8
scala> if (x<10) println(s"$x is smaller than 10")

8 is smaller than 10

2)if...else...语句

if(条件判断){

//条件判断为真的时候执行

}else{

//条件判断为假时执行

}

示例:

scala> val x=9
x: Int = 9
scala> if(x<8) println("small") else println("big")

big

3)if...else if ...else...语句

if(条件判断语句1){

//条件判断语句1为真的时候执行

}else if(条件判断语句2){

//条件判断语句2为真的时候执行

}else if(条件判断语句3){

//条件判断语句3为真的时候执行

}else{

//上面的条件判断语句都为假的时候执行

}

4)if的嵌套使用

 

if(条件判断语句1){

    if(条件判断语句2){

    //条件判断语句2为真的时候执行

   }else{

 

   //条件判断语句2为假的时候执行

  }

}else{

//条件判断语句为假的时候执行

}

5)if表达式

    Scala中的if可以作为表达式使用,表达式的返回值就是if或者else的最后一句,可以直接赋值给变量。
    例如:val age=20; if (age>18) 1 else 0
    可以将if表达式赋值给一个变量,例如:val isAdult=if(age>18) 1 else 0
    另一种写法:
    val isAdult=-1
    if(age>18) isAdult=1 else isAdult=0
    通常情况使用第一种方式将结果赋值给变量。

scala>  val isAdult=if(age>18) 1 else 0

x: Int = 1

6)if表达式类型推断

由于if表达式是有值的,而if和else字句的值类型可能不同,此时if表达式的值是什么类型呢?Scala会自动进行判断,取两个类型的公共类型。

例如:if(age>18) 1 else 0  表达式的类型是Int,因为1 和0 都是Int。

例如:if(age>18)  "adult" else 0 此时if和else 的值分别是String和Int,则表达式的值是Any,Any是String和Int的公共类型。

如果if后面没有else,则默认else的值是Unit,也可以用()表示类似于java的void或者null

例如:if(age>18) "adult" 此时相当于if(age>18) "adult" else ()

7)if语句放在多行中

可以使用{}的表达式

8)语句终止符和块表达式

默认情况下,scala不需要语句终止符,默认将每一行作为一条语句。

一行放多条语句,如果一行要放多条语句,则必须使用语句终止符。

如:使用分号作为语句终止符 var a,b,c=0 ;if(a<10) {b=b+1;c=c+1}

通常情况下,对于多行语句,还是会使用花括号的方式

if(a<10){

b=b+1

c=c+1

}

块表达式:块表达式是指{}中的值,其中可以包含多条语句,最后一条语句的值就是表达式的返回值。

 val d=if(a<10) {b=b+1;c+1}

输入和输出:

print和println的区别就是print不换行;而println是不换行

printf可以用于格式化 如:printf(s"%s is a cool","ysj")      ysj is a cool

readLine:允许我们从控制台读取用户输入的数据;类似于java 的System.in 和Scaner的作用。

 

二、while循环语句

Scala中也提供了while循环语句,不过scala弱化了while语句的循环功能,在程序的设计中不推荐使用while,尽量的使用for循环或者递归来替代while循环语句。

1)while的使用

while(条件判断){

//条件判断为真的时候执行

2)do while的使用

do{

//先执行,再进行条件的判断,如果为真继续执行

}while(条件判断)

与if不同的是:while和do... while()也有返回值,只不过其返回值都为Unit。

var i=15

var x=while(i<20){

println(i)

i+=1

}

15
16
17
18
19
x: Unit = ()

三、for循环语句

1)Scala有自己的循环风格,语法格式如下:

for(i <- 表达式){

//执行循环中的语句

}

for(i<- 1 to 5){

println("i="+i)

}

运行结果:

1

2

3

4

5

<-  符号被称为生成器,for循环实际上是对集合的遍历来达到循环的目的的,它首先执行 1 to 5 ,相当于调用1.to(5),但是我们知道,整型没有to方法,此时它会将Int类型隐式的转换为scala.runtime.RichInt类型,然后再去调用RichInt的to方法。

1 to 5 生成的集合包含5个元素,即:元素的范围是[1,5],如果希望是右开的则可以使用 1 until 5 即 元素的范围是  [1,5)

scala> 1 until 5
res8: scala.collection.immutable.Range = Range(1, 2, 3, 4)

2)在循环的时候 to 、until方法都可以设置步长。

scala> for(i<- 1 until(10,2)) println("i="+i)
i=1
i=3
i=5
i=7
i=9

scala> for(i<- 1 to(10,2)) println("i="+i)
i=1
i=3
i=5
i=7
i=9

3)无论是for循环还是while循环,scala中都没有提供java语言中的break、continue关键字。

但是我们可以通过两种途径实现 

一是定义Boolean类型的变量,在for或者while循环中进行条件的判断 ;下节介绍。

二是在程序中引入scala.until.control.Breaks类。

//引入Breaks类及所有的方法

import scala.util.control.Breaks._

//调用Breaks中定义的breakable方法

breakable{

    for(i<- 1 to 5){

    if(i>2) break

    println("i="+i)

}

}

运行结果:

i=1 

i=2

4)有过滤条件的for循环

可以使用有过滤条件的for循环退出for循环

for(x <- 表达式 if条件判断1;if条件判断2...){

//所有条件判断都满足时才执行循环的语句

}

示例代码:

for(i<- 1 to 5 if(i<3)){

println("i="+i)

}

i=1

i=2

5)多重for循环

语法格式:

for(x<- 表达式 if 条件判断1;if条件判断2...){

    for(x<- 表达式 if 条件判断1;if条件判断2...){

    //所有的条件都满足的时候才执行循环中的语句

}

}

示例代码:

for(i<- 1to 5 if(i>3)){

    for (j<- 5 to 7 if(j==6)){

    println("i="+i+",j="+j)

}

}

i=4,j=6

i=5,j=6

6)作为表达式的for循环 

for循环同关键字yield一起使用可作为表达式,循环执行完后有返回值。

scala> val x= for(i<- 1 to 5) yield i
x: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5)

for循环每执行一次,yield就会生成对应的值保存在缓存中,当循环执行完后,它会利用前面循环中的得到的值生成一个集合并返回。关键字后面还可以跟表达式。

scala>  val x= for(i<- 1 to 5) yield i%2==0
x: scala.collection.immutable.IndexedSeq[Boolean] = Vector(false, true, false, true, false)

scala>  val x= for(i<- 1 to 5) yield i/2
x: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 1, 2, 2)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Martin Odersky 用他定义的匹萨语言给了 Java世界一个很大的冲击。尽管匹萨本身没有流行 但它展现了当把面向对象和函数型语言两种风格,技术地且很有品地混搭在一起时,就形成了 自然和强有力的组合。匹萨的设计成为了 Java泛型的基础,马丁的 GJ(Generic Java)编译 Java 1.3开始成为了 Sun 微系统的标准编译器(尽管关闭了泛型)。我有幸能够维护这个编译 年,因此我能通过第一手经验从语言设计到语言的实现方面(向大家)报告马丁的技术。 那时候我们还在 Sun 公司,尝试用一些零打碎敲的特定问题解决方案来扩展语言,如 for-eac 环,枚举,自动装包,去简化程序开发的时候,马丁则继续着他在更强大的正交语言原语方面 作以帮助程序员用库来提供解决方案。 后来,静态类型语言受到了冲击。Java 的经验说明了静态语言编程会导致大量的固定写法的代 通常认为我们应该避免静态类型从而消除这种代码,于是人们对动态语言如 Python,Rub Groovy的兴趣开始增加。这种认知被马丁最近的作品,Scala,的出现打破。 Scala 是一种很有品味的类型语言:它是静态类型的,但仅在需要的地方显式定义类型。Scala 向对象和函数式语言两方面获得了强大的特性,然后用一些新奇的点子把它们漂亮地整合成一 它的语法是如此的轻量级,而原语又如此富有表达力,以至于根本可以认为 API的使用不须负 法开销。我们可以在标准库中,如拆分器、组合器和执行器,中发现例子。从这点上看,Scal 一种支持内嵌的域特化:embedded domain-specific 的语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值