在上一篇《十二步学会Scala-1
》介绍了Scala的变量定义和方法定义,
这一篇将介绍循环和数组
第五步:运行脚本
Scala是一个动态性很强的语言,所以它也像Ruby那样,能够写脚本运行。
新建一个hello.scala的文本文件,
hello.scala 写道
println("Hello, world, from a script!")
打开命令行,并到达hello.scala所在的目录,
cmd 写道
D:\>scala hello.scala
Hello, world, from a script!
D:\>
可以看到很简单,就运行了这个脚本。
第六步: 循环用while, 判断用if
Scala中使用while和java差不多。
写个把输入的参数字符逐个打印出来的小脚本,printargs.scala
printargs.scala 写道
var i = 0
while (i < args.length) {
println(args(i))
i += 1
}
这段脚本会把传入的参数逐个打印出来。
while循环体外定义一个可变的变量i,在循环体内每次加一,直到传入的参数全部打印完毕。
cmd 写道
D:\>scala printargs.scala Scala is fun
Scala
is
fun
D:\>
注意,Scala中不能用i++或++i
if在第一篇的max方法中演示过了,不再重复。
第七步:用foreach和for进行迭代
上面介绍了用while做循环,用过ruby或者喜欢java5新特性的人可能会说,hey,做个循环怎么这么丑?
ruby,java5有foreach,Scala当然也有!
接着上面的需求,用foreach实现把传入的参数打印出来。
建个文本文件,叫pa.scala,里面写上
pa.scala 写道
args.foreach(arg => println(arg))
运行pa.scala你会看到
cmd 写道
D:\>scala pa.scala Scala is easy
Scala
is
easy
D:\>
arg是迭代变量,不需要手工赋值,编译器会把传递给它。
同时编译器会认出arg的类型,所以这里不需要定义类型。
但我觉得如果类型不是一目了然的情况下,最好是定义一下类型,可以使阅读代码的人很轻松。
把arg定义上类型
pa.scala 写道
args.foreach((arg: String) => println(arg))
注意当给变量定义类型的时候,必须要加括号!
这里传给foreach的实际上就是一个匿名方法!
匿名方法的定义是这样的:
方法参数 => 方法体
我们这个传入的匿名方法就是: (arg: String) => println(arg)
很懒的程序员会发现,这里arg好像没什么必要,唯一参数传给唯一的方法体。
在java这样的想法可能是空幻想,但Scala帮你实现了!
我们可以省略成:
pa.scala 写道
args.foreach(println)
就这么少!
Scala还有一个for迭代,可以做更多的事情,但这里只介绍一下它的简单用法。
在ruby中实现上面的打印参数:
ruby 写道
for arg in ARGV # Remember, this is Ruby, not Scala
puts arg
end
用Scala的for来实现
scala 写道
for (arg <- args)
println(arg)
感觉怎么样?这里左箭头<-可以读成in。
在Scala,如果一句话是一行,可以省略分号;如果多个语句放在一行,用分号隔开。
第八步: 数组
数组是定义数据类型很重要很基础的容器。
在Scala里如何使用数组呢?
这次我们的参数由程序定义,并把他们打印出来。
建个文本文件,叫paramswithvalues.scala
paramswithvalues.scala 写道
val greetStrings = new Array[String](3)
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!\n"
for (i <- 0 to 2)
print(greetStrings(i))
这里出现了很多Scala的新式武器!
1. 定义数组类型
val greetStrings = new Array[String](3)
val已经介绍过了,表示greetStrings不能再被赋值。
这里Array[String]表示类型,可以读成字符串的数组,它是一个类型,也就是类,所以可以用new去实例化。
括号3表示数组容量是3
2. 数组元素赋值
greetStrings(0) = "Hello"
虽然greetStrings是不可更改的,但数字元素可以。
Scala用小括号代替java的中括号,可能很多java工程师会说:呵,发明新轮子。
其实Scala是被冤枉的。
Scala里所以东西都是对象,数组也不例外。数组赋值其实也是一个方法完成的。
上面的代码会被编译器转换成两个参数的方法:
greetStrings.update(0, "Hello")
当然你也直接这样写上面的赋值:
greetStrings.update(0, "Hello")
greetStrings.update(1, ", ")
greetStrings.update(2, "world!\n")
3. 数组元素读取
在for循环体里面有
print(greetStrings(i))
为什么Scala不用中括号呢?是因为Scala有一套通用规则,会把小括号转换成apply。
所以编译器会得到这样的代码:
print(greetStrings.apply(i))
很魔术?其实只要知道Scala的一些通用规则,很多符号就变得非常简单易懂了。
如果不使用符号,我们的代码同样可以完成:
val greetStrings = new Array[String](3)
greetStrings.update(0, "Hello")
greetStrings.update(1, ", ")
greetStrings.update(2, "world!\n")
for (i <- 0.to(2))
print(greetStrings.apply(i))
这里for循环用了0 to 2,很容易理解,就是从0到2,默认步进1.
当方法参数只有一个的时候,可以不写括号和点,
所以第一循环是这样写就够了:
for (i <- 0 to 2)
to是0的一个方法,
for (i <- 0.to(2))
数组就基本介绍到这里。
接下来一篇将介绍集合类。
未完待续
分享到:
相关推荐
Scalaz,或者我是如何学会停止担心并爱上单子的
资源包含《Scala编程》第3版英文版和第3版源代码,Scala编程第3版,目前是最新版,支持Scala... 因此学习这本书,不单单是学会了scala语言本身,更重要的是扩展了视野,提升了思维能力和培养了考虑问题的思维方式方法。
学习spark之前,大家必须先学会Scala这门语言,他是spark的基础,这里总结了一下Scala集合的相关知识点
本书循序渐进地介绍了Scala的函数式编程基础,虽然篇幅...读者可以学会使用Scala静态语言的强大功能创建简洁、可扩展、高度可并行的代码。对于多核时代JVM上的并发编程,Scala是绝好的工具,而本书是你必不可少的向导。
Scala是一种针对 JVM 的通用的编程语言,用来以简明、...读者可以学会使用Scala静态语言的强大功能创建简洁、可扩展、高度可并行的代码。对于多核时代JVM上的并发编程,Scala是绝好的工具,而本书是你必不可少的向导。
IDEA确实很优秀,学会之后,用起来很顺手。关于如何搭建scala和IDEA开发环境,请看文末的参考资料。用Scala和Java实现WordCount,其中Java实现的JavaWordCount是spark自带的例子($SPARK_HOME/examples/src/main/...
如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法。 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的。 我们可以认为 Scala 程序是对象的集合,通过...
2. 学会在Spark Shell中编写Scala程序; 3. 学会在Spark Shell中运行Scala程序。 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 三、实验内容 (一)Spark基础知识 (1)输入start-...
我学会了使用Spark编写分布式的数据处理程序,并通过调优技巧提高了程序的性能。在实践过程中,我遇到了一些挑战,比如调试复杂的数据流转和处理逻辑,但通过查阅文档和与同学的讨论,我成功地克服了这些困难。最终...
今天我学会了-源码
七天学会七种编程语言(Seven Languages in Seven Weeks)Jolt大奖2010年作品(英文版chm)。 涵盖流行语言Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell以及综合的掌握的教程,很吸引人吧,请根据需要选择...
一旦你学会使用它们,生产力的提高是巨大的。 解析器组合器是从 Haskell 借来的一个特性,Haskell 是一种您可能应该看看的纯函数式语言。 支持的格式 礼物 QTI ##支持的问题类型 单选题 多项选择题(带加权答案)...
多个时间窗口:因此,每个功能都可以在1-2-4-8-n天的时间内进行更新。 范围设定:例如,特定查询的商品点击率。 绝对值和相对值:可以跟踪每个项目的点击次数占点击总数的百分比。 使用可插拔数据库连接器存储...
java中solr的笔试题 ...学会使用,特别对于spring框架,理解其原理,深度mybatis源码。 spring/spring MVC/Spring Cloud/Spring Boot django/flask mybatis 存储 对于数据存储类的技术栈,主要是在缓存