大数据之脚踏实地学13--Scala控制流
原创
©著作权归作者所有:来自51CTO博客作者lsxxx2011的原创作品,请联系作者获取转载授权,否则将追究法律责任
Scala中的输入与输出
在Scala中经常会涉及到变量值的输入和输出,输入是指通过键盘将数据信息传送到Scala环境的内存中,输出则是指将内存中的数据返回到指定的地方(如电脑屏幕、本地文件或数据库等)。
两种输入方法
- 通过等号赋值的方法,向变量中传递值
- 调用scala.io.StdIn包中的read类函数,在屏幕中完成数据的输入
举例
import scala.io.StdIn._ // 下划线代表StdIn包内的所有函数object InPut { def main(args: Array[String]): Unit = { // 方法一:等号赋值法 val name : String = "刘顺祥" // 方法二:函数输入法 println("请输入您的年龄:") val age = readInt() // 输入不同数据类型的值,所使用的函数不一样 println("亲爱的" + name + "先生,您的年龄为" + age + "岁") }}
两种输出方法
- 直接调用变量名的名称,但该方法只能在交互的REPL中执行
- 借助于打印函数,该方法又可以衍生出三种用法,即:
a) println,结合加号(+),将多个内容进行连接并打印输出
b) println,传入表达式(表达式中所涉及的变量必须以美元符号作前缀),
其中表达式须用大括号框起来,同时需要在被打印对象的最前面加上字母s
c) printf,格式化输出,类似于Python的用法
举例
object OutPut { def main(args : Array[String]) : Unit = { val name = "刘顺祥" val balance = 6.52 // 加号(+)拼接法 println("亲爱的" + name + "先生,您的话费余额为" + balance + "元。") // s表达式法 println(s"亲爱的${name}先生,您的话费余额为${balance}元") // 格式化输出法 printf("亲爱的%s先生,您的话费余额为%.2f元\n", name, balance) }}
需要注意的是,在Scala中,打印函数println和print的区别在于前者打印完会自动换行,而后者却不能换行,如需换行必须在打印内容的结尾添加\n。
Scala中的控制流
在Scala编程中,会经常使用到控制流技术,基于该技术,可以轻松地解决很多重复性的工作。本文主要分享有关控制流中的if分支、for循环和while循环。
if分支
if分支主要包含三种,分别是单分支、双分支和多分支,语法如下:
// 单分支if (condition) { expression }// 双分支if (condition) {expression1} else {expression2}// 多分支(以三支为例)if (condition1) {expression1} else if (condition2) {expression2} else {expression3}
举例
import scala.io.StdInobject IfBranch01 { def main(args: Array[String]): Unit = { // 判断用户是否登录成功 println("请输入用户名:") val name = StdIn.readLine() println("请输入密码:") val passwd = StdIn.readLine() if (name == "scala" && passwd == "12345678") { println("登录成功!欢迎来到学习乐园") } // 判断学员是否通过科目二考试 println("请输入您的考试成绩:") val score = StdIn.readInt() if (score >= 90) { println("恭喜您,考试合格!") } else { println("很遗憾,下次继续努力哦!") } // 根据用户的年龄,判断其所处的年龄段 println("请输入您的年龄:") val age = StdIn.readInt() if (age < 18){ println("未成年") } else if (age <= 45) { println("青壮年") } else if (age <= 65) { println("中老年") } else { println("老年") } }}
我们再举一个嵌套的例子,假设某旅游区在设置票价时,按照如下规则:如果游客在旺季(3~10月份)来此地旅游,并且他是学生,则票价为80元,否则为150元;如果在淡季,学生票价为50元,否则为100元。该如何利用嵌套的if分支来完成呢?代码如下:
object IfBranch02 { def main(args: Array[String]): Unit = { println("请输入月份:") val month = StdIn.readInt() println("请问是否为学生:") val is_student = StdIn.readLine() if (month >= 3 && month <= 10){ if (is_student == "否") { println("您的票价是150元") } else { println("您的票价是80元") } } else { if (is_student == "否") { println("您的票价是100元") } else { println("您的票价是50元") } } }}
for循环
for循环在某个迭代对象已知的情况下,执行的的重复性操作。语法如下:
for (i <- iterable) { expression }
举例
object ForLoop { def main(args: Array[String]): Unit = { // 统计1...100的所有偶数中,是3的倍数的个数,以及这些数的总和 var counts = 0 var sum = 0 for (i <- 2 to 100 by 2) { if (i % 3 == 0) { counts += 1 sum += i } } printf("1...100的偶数中,是3的倍数的个数为%d个\n", counts) printf("这些数值的总和为%d\n", sum) // 打印99乘法口诀 for (i <- 1 to 9) { for (j <- 1 to i) { print(j + "*" + i + "=" + (i*j) + "\t") } println() } // 将列表中的每个元素做平方除以5的操作,并将运算结果保存到变量res中 val X = List(10,8,23,17,7) val res = for (i <- X) yield { (i * i)/5.0 } println("res = " + res) }}
while循环
在前文介绍了for循环的使用,除此while循环也可以实现重复性操作。所不同的是,for循环主要解决已知可迭代对象的循环问题,而while循环则主要针对未知迭代对象的循环问题,语法如下:
// while循环的语法初始化计数器 while (condition) { expression 计数器叠加 }// do...while的语法初始化计数器 do { expression 计数器叠加 } while (condition)
举例
import scala.io.StdInimport scala.util.control.Breaks._object WhileLoop { def main(args: Array[String]): Unit = { // 计算1...100的和 var i = 1 var sum = 0 while (i <= 100) { sum += i i += 1 } println("1...100的总和为:" + sum) // 用户登录邮箱,一共5次机会,如果输错则继续等待输入,并返回剩余登录次数 breakable{ var counts = 0 while (true) { println("请输入用户名:") val user = StdIn.readLine() println("请输入密码:") val passwd = StdIn.readLine() if (user == "scala" && passwd == "123abc") { println("恭喜您,登录成功!") break() } else { if (counts < 4) { printf(s"输入的用户名或密码错误!您还剩${4 - counts}次输入机会!\n") } else { println("输入的用户名或密码错误!,请24小时之后再尝试!") break() } } counts += 1 } } }}
具有编程经验的你来说,通常在while循环中经常会用到break做强制退出,遗憾的是Scala中没有break关键词,只有break函数,该函数的目的是抛出异常,最终再由breakable函数处理。需要注意的是,break函数的调用需要导入import scala.util.control.Breaks._。
结语
本期的内容就介绍到这里,如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。
每天进步一点点:数据分析1480