起步scala-1

使用 Scala 解释器,首先你需要下载安装 Scala 运行环境。 然后在命令行输入scala,则进入 scala 解释器
可以使用 :help 命令列出一些常用的 Scala 解释器命令。

定义变量

Scala 定义了两种类型的变量 val 和 var ,val 类似于Java中的 final 变量,一旦初始化之后,不可以重新赋值(我们可以称它为 常变量 )。而 var 类似于一般的非 final 变量。可以任意重新赋值。
scala> val msg=“Hello,World”
msg: String = Hello,World

Scala 解释器在新行前面显示 |,表示该行接着上一行

scala> val msg3=
| “Hello world 3rd time”
msg3: String = Hello world 3rd time

定义函数

Scala 函数以 def 定义,之后是函数的名称(如 max ),然后是以逗号分隔的参数。Scala 中变量类型是放在参数和变量的后面,以 : 隔开。这样做的一个好处是便于“ type inference ”。同样如果函数需要返回值,它的类型也是定义在参数的后面(实际上每个Scala函数都有返回值,只是有些返回值类型为 Unit ,类似于 void 类型)。

对于大多数函数 Scala 都可以推测出函数返回值的类型,但目前来说回溯函数(函数调用自身)还是需要指明返回结果类型的。

scala> def max(x:Int,y:Int) : Int ={
| if (x >y) x
| else
| y
| }
max: (x: Int, y: Int)Int

scala> def greet() = println(“hello,world”)
greet: ()Unit

greet 函数的返回值类型为 Unit ,表示该函数不返回任何有意义的值,Unit 类似于 Java 中的 void 类型。这种类型的函数主要用来获得函数的“副作用”,比如本函数的副作用是打印招呼语。

使用while循环

val args = Array(“I”,“like”,“scala”)
var i=0
while (i < args.length) {
println (args(i))
i+=1
}
这里要注意的是 Scala 不支持 ++i 和 i++ 运算符,因此需要使用 i += 1 来加一。 这段代码看起来和 Java 代码差不多,实际上 while 也是一个函数,你自然可以利用 Scala 语言的扩展性,实现 while 语句,使它看起来和 Scala 语言自带的关键字一样调用。

Scala 访问数组的语法是使用 () 而非 [] 。

使用foreach和for实现迭代

scala> args.foreach(arg => println(arg))
I
like
scala
调用args的foreach方法,传入一个参数,这个参数类型也是一个函数。如果一个函数只有一个参数,并且只包含一个表达式,那么可以不用指明参数。
上式可以写为:args.foreach(println)
for(arg<-args)
println(arg)

使用类型参数化数组

在scala中可以使用new来实例化一个类,当创建一个对象的实例时,可以使用数值或者类型参数,不同于java的是,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 使用 [] 来为数组指明类型化参数,本例使用 String 类型,数组使用 () 而非 [] 来指明数组的索引。其中的 for 表达式中使用到 0 to 2 ,这个表达式演示了 Scala 的一个基本规则,如果一个方法只有一个参数,你可以不用括号和 . 来调用这个方法。

因此这里的 0 to 2, 其实为 (0).to(2) 调用的为整数类型的 to 方法,to 方法使用一个参数。Scala 中所有的基本数据类型也是对象(和 Java 不同),因此 0 可以有方法(实际上调用的是 RichInt 的方法),这种只有一个参数的方法可以使用操作符的写法(不用 . 和括号),实际上 Scala 中表达式 1+2 ,最终解释为 (1).+(2)+,这也是 Int 的一个方法,和 Java 不同的是,Scala 对方法的名称没有太多的限制,你可以使用符号作为方法的名称。

这里也说明为什么 Scala 中使用 () 来访问数组元素,在 Scala 中,数组和其它普遍的类定义一样,没有什么特别之处,当你在某个值后面使用 () 时,Scala 将其翻译成对应对象的 apply 方法。因此本例中 greetStrings(1) 其实是调用 greetString.apply(1) 方法。这种表达方法不仅仅只限于数组,对于任何对象,如果在其后面使用 () ,都将调用该对象的 apply 方法。同样的如果对某个使用 () 的对象赋值,比如:

greetStrings(0)=“Hello”
Scala 将这种赋值转换为该对象的 update 方法, 也就是 greetStrings.update(0,”hello”) 。

使用Lists

数组的元素时可以被修改的。如果需要使用不可以被修改的序列,Scala使用List类。

val oneTwo = List(1,2)
val threeFour = List(3,4)
val oneTwoThreeFour=oneTwo ::: threeFour
println (oneTwo + " and " + threeFour + " were not mutated.")
println ("Thus, " + oneTwoThreeFour + " is a new list")

通过 ::: 操作符(其实为 ::: 方法)将两个列表连接起来,由于List的不可修改行,Scala创建了一个新的List对象来保存两个列表连接后的值。

List 也提供了一个 :: 方法用来向 List 中添加一个元素,:: 方法(操作符)是右操作符,也就是使用 :: 右边的对象来调用它的 :: 方法,Scala 中规定所有以 : 开头的操作符都是右操作符,因此如果你自己定义以 : 开头的方法(操作符)也是右操作符

如下面使用常量创建一个列表:

val oneTwoThree = 1 :: 2 ::3 :: Nil
println(oneTwoThree)

调用空列表对象 Nil 的 :: 方法 也就是:

val oneTwoThree = Nil.::(3).::(2).::(1)

Scala 的 List 类还定义了其它很多很有用的方法,比如 head、last、length、reverse、tail 等。

使用元组(Tuples)

Scala中另外一个很有用的容器类为 Tuples ,和 List 不同的是,Tuples 可以包含不同类型的数据,而 List只能包含同类型的数据。Tuples 在方法需要返回多个结果时非常有用。(Tuple 对应到数学的 矢量 的概念)。

一旦定义了一个元组,可以使用 ._ 和 索引 来访问元组的元素(矢量的分量,注意和数组不同的是,元组的索引从1开始)

scala> val pair=(99,“Luftballons”)
pair: (Int, String) = (99,Luftballons)

scala> println(pair._1)
99

目前 Scala 支持的元组的最大长度为 22 。如果有需要,你可以自己扩展更长的元组。

使用Sets 和Maps

Set是没有重复对象的集合,所有的元素都是唯一的。
比如 Scala API 定义了 Set 的 基Trait 类型 Set (Trait 的概念类似于Java中的 Interface,所不同的是Scala中的 Trait 可以有方法的实现),分两个包定义 Mutable (可变)和 Immutable (不可变),使用同样名称的子 Trait 。下图为 Trait 和类的基础关系:
在这里插入图片描述
缺省情况 Set 为 Immutable Set,如果你需要使用可修改的集合类( Set 类型),你可以使用全路径来指明 Set ,比如 scala.collection.mutable.Set 。

scala> var jetSet = Set(“Boeing”,“Airbus”)
jetSet: scala.collection.immutable.Set[String] = Set(Boeing, Airbus)

Scala 提供的另外一个类型为 Map 类型,Map(映射)是一种可迭代的key/value结构,所有的值都可以通过键来获取。 Scala 也提供了 Mutable 和 Immutable 两种 Map 类型

scala> val romanNumeral = Map(1 -> “I”, 2->“II”, 3-> “III”,4->“IV”,5-> “V”)
romanNumeral: scala.collection.immutable.Map[Int,String] = Map(5 -> V, 1 -> I, 2 -> II, 3 -> III, 4 -> IV)

读取文件

import scala.io.Source

var args=Source.fromFile("/home/hadoop/test.txt")
for( line <- args.getLines)
println(line.length + “” + line)
通过 import 语句。文件相关的类定义在 scala.io 包中。 如果需要引入多个类, Scala 使用 _ 而非 *。

猜你喜欢

转载自blog.csdn.net/weixin_42521881/article/details/86529062
今日推荐