Scala学习笔记--第2章 控制结构

2.1 条件表达式

Scala的if/else语法结构和Java一样,不同的是Scala的if/else表达式有值,这个值就是跟在if或者else后面表达式的值。

① val result = id (x >= 0) 1 else -1

② if (x >= 0) result = 1 else result = -1

通常都是采用第一种写法,因为变量可以定义为val,而第二种写法,则需要先将result声明为var。

在Scala中没有二元运算符的说法,像Java中的 ?:,x >= 0 ? 1 : -1,而在scala中需要表示这种结果的话,就只能像上面的第一种写法。

如果else部分缺失了,比如:if(x >= 0) 1,那么可能if语句没有输出值,但实际上Scala是有输出值的,只不过类型是Unit,这个相当于Java中void。

2.2 语句终止及块表达式

类似Java中的大括号{},当需要在逻辑分支或循环中执行多条语句时,就会用{}将代码包含起来,这就是表示语句块,在{}块中,最后一个表达式的值,就是整个{}块的值,这个非常适合初始化某个val时,需要执行多个语句才能完成的情况,例如:

val result = { val dx = x - x0; val dy = y - y0; sqrt(dx * dx + dy * dy)  }

在这条语句中,使用了分号“;”,这个表示执行多条语句进行分隔,在scala语法当中,分号是可有可无的,主要是看个人编码习惯,如果不想在一条语句中放置分号,那么上述代码则变成如下形式:

val result = { 

val dx = x - x0

val dy = y - y0

sqrt(dx * dx + dy * dy)  

}

这两个语句实际上是等价的。

2.3 输入输出

Scala中的打印是非常简单的,Java中是用System.out.print或者println来进行输出,而在Scala中,则直接使用print或者println即可,并且也支持C风格的格式化字符串输出printf,例如:

scala> println("hello scala")

hello scala


scala> printf("hello, my name is %s\n, and my age is %d", "Kevin", 30)

hello, my name is Kevin

, and my age is 30

在Scala中,也可以用readLine函数从控制台读取输入的内容,如果读取数字、Boolean或者字符,可以用readInt、readDouble等方法,与其他方法不同,readLine带一个参数作为提示字符串:

 val name = readLine("your name is :")

your name is :name: String = kevin

2.4 for循环

Scala的for循环与Java是有很大区别的,学过Java的都知道怎么使用for循环,例如:for(初始化变量;检查是否满足某个条件;更新变量),而在Scala中,是不存在这种方式,那Scala中的for循环是怎样的?

for (i < - 1 to 10)

r = r * i

其中 1to10 是表示1到10 的区间,而符号“<-“则表示遍历右边表达式的所有值,至于遍历如何执行,则取决于表达式的类型。

遍历字符串和数组时,通常使用从0 到 n-1 的区间,这个时候可以用until方法,而不是前面提到的to。

    val hello = "helloworld"     //> hello  : String = helloworld

    var s = 0                     //> s  : Int = 0

    for (i <- 0 until hello.length) {

    s += hello(i)

    }

    println(s)                   //> 1084


说明:在Scala中并没有break和continue来退出循环,那么在scala中想实现退出循环应该怎么做:

  1. 使用Boolean控制变量;
  2. 使用嵌套函数进行return
  3. 使用Breaks对象中的break方法:

import scala.util.control.Breaks._

breakable {

for (…) {

if(…) break; // 退出breakable块

}

}

第三种方式比较难理解,也比较容易出错,建议不使用。

2.5 for循环推导式

在for循环的循环体中,以yield开始,则该循环会构造出一个集合,每次迭代都会生成集合中的一个值,例如我们定义一个变量:

var nums = for (n <- 1 to 10) yield n * 10    

//> nums  : scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

nums的类型为 scala.collection.immutable.IndexedSeq[Int],值为Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

这类循环在scala中就被称作for推导式,它生成的集合与它的第一个生成器是类型兼容的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值