理论教育 Scala流程控制实例-IF、WHILE、FOR

Scala流程控制实例-IF、WHILE、FOR

时间:2023-11-24 理论教育 版权反馈
【摘要】:args.isEmpty)file=args两行语句,用val变量重新定义file变量,如例1-10所示。file赋值传入的参数Spark.tar.gz,打印的file结果是Spark.tar.gz。图1-50运行结果2.while循环语句while循环语句为条件判断语句,是指利用一个条件来控制是否要继续反复执行循环体中的语句。调用looper函数,经过while语句循环遍历后,计算结果值为2。例1-17的代码用于读取根目录中所有文件及目录,将目录文件名称列表赋值给files变量,然后使用for循环将files依次读入到fi

Scala流程控制实例-IF、WHILE、FOR

1.if语句 if条件语句用于在程序执行中,如果在某个条件成立的情况下执行某段语句,而在另外一种情况下执行另外的语句。关键字if之后是作为条件的布尔表达式,如果布尔表达式的返回结果为true,则执行其后的语句序列;如果布尔表达式为false,则不执行if条件之后的语句。

if语法如下:

978-7-111-54169-1-Chapter01-118.jpg

如例1-9中示例代码定义了一个var变量file,file默认赋值scala.txt。定义一个if表达式,判断main传入的参数列表是否为空,如果为空参数,则使用之前定义的file变量值Scala.txt;如果传入参数不为空,则file赋值传入的参数。

【例1-9】Scala if语句示例。

978-7-111-54169-1-Chapter01-119.jpg

运行结果如图1-46所示。程序判断args参数是空值,因此打印输出的file的值Scala.txt。

978-7-111-54169-1-Chapter01-120.jpg

图1-46 运行结果

选择Run as→Run Configurations命令,弹出Run Configurations的配置对话框,在Argu⁃ments选项卡的Program arguments列表框中输入参数Spark.tar.gz,如图1-47所示。

978-7-111-54169-1-Chapter01-121.jpg

图1-47 传入参数

单击Run(运行)按钮,由于main有传入的参数Spark.tar.gz,所以if(!args.isEmpty)为真,则file赋值传入的参数Spark.tar.gz,此时打印的file结果是Spark.tar.gz,运行结果如图1-48所示。

978-7-111-54169-1-Chapter01-122.jpg

图1-48 运行结果

去掉例1-9中var file="Scala.txt"和if(!args.isEmpty)file=args(0)两行语句,用val变量重新定义file变量,如例1-10所示。

【例1-10】Scala if语句示例:使用val变量改写。

978-7-111-54169-1-Chapter01-123.jpg

运行结果如图1-49所示。file赋值传入的参数Spark.tar.gz,打印的file结果是Spark.tar.gz。

978-7-111-54169-1-Chapter01-124.jpg

图1-49 运行结果

使代码更简洁的方法是将if(!args.isEmpty)args(0)else"Spark.xml"整个if表达式作为参数传给println函数,一行Scala语句就实现file的赋值,打印输出file变量的值。如例1-11所示。

【例1-11】Scala if语句示例:继续改写。

978-7-111-54169-1-Chapter01-125.jpg

运行结果如图1-50所示。

978-7-111-54169-1-Chapter01-126.jpg

图1-50 运行结果

2.while循环语句

while循环语句为条件判断语句,是指利用一个条件来控制是否要继续反复执行循环体中的语句。语法如下:

978-7-111-54169-1-Chapter01-127.jpg

当条件表达式的返回值为真时,则执行{}循环体中的语句序列,然后重新判断条件表达式的返回值,如果条件表达式的返回结果为假,退出while循环,循环结束。定义looper函数,looper函数里面包括一个while循环语句。如例1-12所示。

【例1-12】Scala while语句示例。

978-7-111-54169-1-Chapter01-128.jpg

运行结果如图1-51所示。调用looper(100,298)函数,经过while语句循环遍历后,计算结果值为2。

978-7-111-54169-1-Chapter01-129.jpg

图1-51 looper运行结果

  looper函数其实是计算两个参数的最大公约数,最大公约数指某几个整数共有因子中最大的一个。如12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数。looper函数的计算过程,可以在代码中加几条打印语句,更加清楚地展示整个循环过程。如例1-13所示。

【例1-13】Scala looper函数的计算过程。

978-7-111-54169-1-Chapter01-130.jpg

运行结果如图1-52所示。在looper函数代码串加入日志打印语句,动态显示while语句的执行过程,计算出结果值为2。

978-7-111-54169-1-Chapter01-131.jpg

图1-52 looper函数运行结果

从looper函数的运行结果中可以非常清楚地看出,当while语句执行到a等于0时,循环结束,此时b的值为2,将b的值作为整个looper函数的返回值返回给println函数打印出来。

while循环有时也可以使用递归函数来实现,最大公约数的例子中对looper函数使用递归调用,这里递归无须定义var变量和temp临时变量,是Scala语言函数式编程风格的体现,相对于指令式编程风格,递归代码简洁、易懂。

looper递归函数如参数y的值等于0,就返回函数结果x;否则就递归调用y和x取余y的计算值来递归计算。计算出的结果为2。如例1-14所示。

【例1-14】Scala looper函数的递归实现示例。

978-7-111-54169-1-Chapter01-132.jpg

运行结果如图1-53所示。

978-7-111-54169-1-Chapter01-133.jpg

图1-53 looper递归实现

3.do…while循环语句 do…while循环语句和while语句类似,两者的区别是while语句先判断条件是否成立,再执行循环体;而do…while循环语句先执行一次循环语句,再判断条件是否成立,这样do…while循环语句中的语句序列至少要执行一次。

语法如下:(www.daowen.com)

do{

语句序列

While(条件表达式)

例1-15中定义了一个do…While函数,do…While函数先定义line变量,用于接收在Console视图中输入的字符串。然后执行do循环体,line变量等于输入的一行字符串,使用println打印输出输入字符串,当输入字符串不为空时,就一直执行循环体打印输出字符串;如果不再输入字符串,在Console视图中直接按Enter键,退出循环。

【例1-15】Scala doWhile示例。

978-7-111-54169-1-Chapter01-134.jpg

978-7-111-54169-1-Chapter01-135.jpg

运行结果如图1-54所示。

978-7-111-54169-1-Chapter01-136.jpg

图1-54 do…While函数运行结果

4.for循环语句 for循环语句可以重复执行某条语句序列,直到某个条件得到满足,才退出循环。

for语法如下:

for(表达式;表达式;表达式)

{语句序列

for循环语句示例如例1-16所示,其中将1到10依次赋值给变量i,循环执行10次,每次打印输出i的值。

【例1-16】Scala for循环语句示例。

978-7-111-54169-1-Chapter01-137.jpg

运行结果如图1-55所示。

978-7-111-54169-1-Chapter01-138.jpg

图1-55 for循环语句

条件表达式中i<-1 to 10,其中to作为中缀运算符,也可以写成i<-1.to(10),这里to(10)是作为数字1的方法来调用的。

978-7-111-54169-1-Chapter01-139.jpg

例1-17的代码用于读取根目录中所有文件及目录,将目录文件名称列表赋值给files变量,然后使用for循环将files依次读入到file中,打印输出file的值。

【例1-17】Scala for循环语句读取根目录的所有文件及目录示例。

978-7-111-54169-1-Chapter01-140.jpg

运行结果如图1-56所示。

978-7-111-54169-1-Chapter01-141.jpg

图1-56 读取根目录的所有文件及目录

Scala语言的for循环表达式比Java语言中for循环表达式的功能更丰富。Scala中的for循环表达式具有更高级的形态,如以下代码在Scala中定义一个生成器(for…yield),yield方法体中的语句在for循环每次迭代的时候运行,并且返回一个元组值,包含3个元素(num,num∗10,num∗100),yield最终返回结果foryieldResult集合的类型List与被遍历的元素nums=List(1,2,3,4)集合类型List是一致的。

978-7-111-54169-1-Chapter01-142.jpg

代码运行结果如下:

978-7-111-54169-1-Chapter01-143.jpg

在for表达式中定义生成器、定义变量、定义过滤器,较复杂的用例如例1-18所示。

●生成器为for...yield,for循环迭代会将persons列表中的所有元素进行遍历,yield会产生一个值(person.name,child.name),这个值被循环记录下来;当循环结束后,会返回所有yield的值(person.name,child.name)组成的集合;返回集合的类型与被遍历的集合类型是一致的。

●定义为name=person.name,相当于起个别名,可以在后面的过滤器和条件中进行使用。

●if语句是一个过滤器,将遍历的列表中的符合要求的元素进行过滤。

【例1-18】Scala for语句生成器、定义和过滤器示例。

978-7-111-54169-1-Chapter01-144.jpg

978-7-111-54169-1-Chapter01-145.jpg

运行结果如图1-57所示。结果是找出母亲和母亲的孩子。从lauren,rocky,Vivian找出女士Vivian,而且返回Vivian和孩子的集合lauren,rocky。

978-7-111-54169-1-Chapter01-146.jpg

图1-57 定义生成器、定义和过滤器

例1-18首先定义了一个case class类:人,包括姓名、性别、孩子等多个参数,然后定义了两位女士lauren、vivian(vivian有两个child,分别为lauren及rocky),一位男士rocky。定义了一个persons列表list,包括lauren、rocky、vivian。

重点看一下for表达式:

1)将persons列表中的元素依次赋值给person,循环执行。

2)定义一个变量name,值为person.name。

3)实现一个过滤器!person.isMale,过滤掉person中的男士。

4)对过滤后的元素,将person.children的值赋值给变量child。

5)将结果保存于生成器yield(person.name,child.name)并赋值给forResult,然后利用println函数打印输出结果:List((Vivian,Lauren),(Vivian,Rocky))。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈