欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量。
1、定义一些函数
scala> def max(x:Int, y:Int) : Int = { | if (x > y) { | x | } else { | y | } | }; max: (x: Int, y: Int)Int scala> max(4, 5) res8: Int = 5
无返回值的函数:
scala> def greet() = println("hello,world") greet: ()Unit scala> greet(); hello,world
greet函数的返回值类型为Unit 表示该函数不返回任何有意义的值,Unit类似于Java中的void类型。
2、使用数组
scala> var greetStrings = new Array[String](3) greetStrings: Array[String] = Array(null, null, null) scala> greetStrings(0) = "Hello" scala> greetStrings(1) = "," scala> greetStrings(2) = "World" scala> for (i <- 0 to 2) | print(greetStrings(i)) Hello,World scala>
Scala使用方括号来指明数据类型,而非尖括号。本例使用String类型,数组使用()而非[]来指明数组的索引。其中的for表达式中使用到 0 to 2,如果一个方法只有一个参数,你可以不用括号和. 来调用这个方法。
这里的 0 to 2, 其实为(0).to(2) ,调用的为整数类型的 to方法,to方法使用一个参数。Scala中所有的基本数据类型也是对象(和Java不同),因此0 可以有方法(实际上调用的是RichInt的方法)。这种只有一个参数的方法可以使用操作符的写法(不用.和括号),实际上Scala中表达式 1+2 ,最终解释为(1).+(2) ,+也是Int的一个方法,和Java不同的是,Scala对方法的名称没有太多的限制。
scala> val greetStrings =Array("Hello",",","World") greetStrings: Array[String] = Array(Hello, ,, World)
3、使用Lists
Scala中提供了Lists类,和Java的List不同,Scala的Lists对象是不可修改的。
scala> val oneTwo = List(1, 2) oneTwo: List[Int] = List(1, 2) scala> val threeFor = List(3, 4) threeFor: List[Int] = List(3, 4) scala> val oneTwoThreeFor = oneTwo ::: threeFor oneTwoThreeFor: List[Int] = List(1, 2, 3, 4) scala> println (oneTwo + " and " + threeFor + " were not mutated.") List(1, 2) and List(3, 4) were not mutated. scala> println ("Thus " + oneTwoThreeFor + " is a new List.") Thus List(1, 2, 3, 4) is a new List. scala>
:::操作符(其实为:::方法)将两个列表链接起来。
List也提供了一个::方法用来向List中添加一个元素,::方法(操作符)是右操作符,也就是使用::右边的对象来调用它的::方法。Scala中规定所有以:开头的操作符都是右操作符,因此如果自定义以:开头的方法(操作符)也是右操作符。
scala> val oneTwoThreeA = 1 :: 2 :: 3 :: Nil oneTwoThreeA: List[Int] = List(1, 2, 3) scala> println (oneTwoThreeA) List(1, 2, 3) scala> val oneTwoThreeB = Nil.::(3).::(2).::(1) oneTwoThreeB: List[Int] = List(1, 2, 3) scala> println (oneTwoThreeB) List(1, 2, 3) scala> println (oneTwoThreeB.head) 1 scala> println (oneTwoThreeB.length) 3 scala> println (oneTwoThreeB.reverse) List(3, 2, 1) scala>
4、使用元组
Scala 中另外一个很有用的容器类为Tuples,和List不同的Tuples可以包含不同类型的数据,而List只能包含同类型的数据。
一旦定义了一个元组,可以使用._和索引来访问员组的元素(矢量的分量,注意和数组不同的是,元组的索引从1开始)。
scala> val paris=(123, "abc") paris: (Int, String) = (123,abc) scala> println (paris._1); 123 scala> println (paris._2); abc scala>
5、使用Sets和Maps
不同的Scala中的Trait(类似于Java中的Interface),分两个包定义Mutable(可变)和Immutable(不可变)。
scala.collection.Set scala.collection.immutable.Set---不可变 scala.collection.immutable.HashSet scala.collection.mutable.Set---可变 scala.collection.mutable.HashSet
scala> var jetSet = Set("Boeing", "Airbus"); jetSet: scala.collection.immutable.Set[String] = Set(Boeing, Airbus) scala> jetSet += "Lear"; scala> println(jetSet.contains("Cessna")); false scala> println(jetSet.contains("Lear")); true scala>
缺省情况Set为Immutable Set,如果你需要使用可修改的集合类(Set类型),你可以使用全路径来指明Set,比如 scala.collection.mutalbe.Set 。
Scala提供的另外一个类型为Map类型,Scala也提供了Mutable和Immutable 两种Map类型
scala.collection.Map scala.collection.immutable.Map scala.collection.immutable.HashMap scala.collection.mutable.Map scala.collection.mutable.HashMap
scala> val romanNum = Map( 1-> "I", 2 -> "II", 3 -> "III", 4 -> "IV"); romanNum: scala.collection.immutable.Map[Int,String] = Map(1 -> I, 2 -> II, 3 -> III, 4 -> scala> println (romanNum(3)); III scala> val newMap = Map ("a" -> "Hello", "b" -> "World", "c" -> "!"); newMap: scala.collection.immutable.Map[String,String] = Map(a -> Hello, b -> World, c -> !) scala> println (newMap ("a")); Hello scala>
6、函数式编程
def printArgs (args : Array[String]) : Unit = { var i = 0; while (i < args.length) { println(args(i)); i += 1; } };
来自Java背景的程序员开始写Scala代码很有可能写成上面的实现。试着去除vars变量,可以写成跟符合函数式编程的代码:
def printArgs (args : Array[String]) : Unit = { for (arg -> args) { println(arg); } }; 或者更简化为: def printArgs (args : Array[String] ) : Unit = { args.foreach(println); };
这个例子也说明了尽量少用vars的好处,代码更简洁和明了,从而也可以减少错误的发生。因此Scala编程的一个基本原则上,能不用vars,尽量不用vars,能不用mutable变量,尽量不用mutable变量,能避免函数的副作用,尽量不产生副作用。
7、读取文件
import scala.io.Source; if (args.length > 0) { for (line <- Source.fromFile(args(0)).getLines()) { println(line.length + "\t" + line); } } else { Console.err.println("Please enter filename."); }
test.txt文件内容
One World One Dream
调用
G:\Hadoop\scala-SDK\source>scala printargs.scala test.txt 9 One World 9 One Dream G:\Hadoop\scala-SDK\source>scala printargs.scala Please enter filename.
Scala引入包的方式和Java类似,也是通过import语句。文件相关的类定义在scala.io包中。 如果需要引入多个类,Scala使用 “_” 而非 “*”。
本文出自 “鲁春利的工作笔记” 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1698784
原文:http://luchunli.blog.51cto.com/2368057/1698784