为了用spark,先学下scala。
参考教程:http://meetfp.com/zh/scala-basic
在线编译:http://meetfp.com/tryout
其它资料:http://scalachina.com/node/16 http://blog.csdn.net/mapdigit/article/details/21878083
特点:
0.环境配置:
先略过,用的在线编译。
object HelloWorld { def main(args: Array[String]) { println("Hello, world!") } }
I.变量函数
1.变量: var ,val—— immutable
var a: Int =5
2.函数(function),过程(procedure)
def add(x: Int, y: Int) : Int = { x + y } println("2 + 3 = " + add(2,3))
def sayHiTo(name: String) { println("Hi, " + name) } sayHiTo("Nini")
PS:(1)命名参数可让你在传参时指定参数名,这样,参数的位置将不再重要。
addUser(name = "Tim", phone = "702-201-2345", age = 33)
(2)默认参数,同其它语言。
(3)重复参数,类型后面有一个'*',这表示这个参数可以重复不定次数,包括0次。当参数个数不是0时,重复参数在内部其实是一个Array。使用时跟Array差不多,只是,调用时不能传递直接Array进来。如果需要传递整个Array(或者别的类型的序列)的话,有一个变通方法,那就是,加一个'_*'符号,该符号与参数之间用逗号分隔,比如 log(array: _*)
。
def log(msgs: String*) = { println(msgs.getClass.getName) println(msgs.mkString(",")) } log() log("one","two","three") val array = Array("one","two","three") //log(array) //above line wouldn't compile, type mismatch, expected String log(array: _*)
II.操作符
unary_!
,或者 unary_-
。 常用操作符及优先性类似c++,不详述了。
* / % + - : = ! < > & ^ |
III.基本类型
在Scala中,基本类型也是class,比如,Int类型,来自scala.Int,每一个数字,都是scala.Int的一个实例。装箱(boxing)和拆箱(unboxing)操作是透明的,程序员不需要关心(实际上,这是由定义在Predef中的隐式转换完成的)。
1.数值类型
每一个基本类型都有一个相对应的富包装类。 基本类型,在必要的时候通过隐式转换转换为对应的富包装类,从而可调用富包装类提供的方法。
//RichInt val n1 = 2 max 3 println("2 max 3 = " + n1) val n2 = -1.abs println("-1.abs = " + n2) val n3 = 1 to 5 println("1 to 5 = " + n3) val n4 = 1.isValidChar println("1.isValidChar = " + n4) val n5 = -1.isValidChar println("-1.isValidChar = " + n5)
2.Scala里的String是直接借用了Java的String。不过,由于String实际是一系列Char的不可变的集合,Scala中大部分针对集合的操作,都可以用于String,具体来说,String的这些方法存在于类scala.collection.immutable.StringOps中。 由于String在需要时能隐式转换为StringOps,因此不需要任何额外的转换,String就可以使用这些方法。
val r3 = str.filter( _ != 'l') //"Heo" println("/"Hello/".filter( _ != 'l') = " + r3)
与Java或C#一样,String是不可变的,对String进行操作,会得到新的String实例。因此在需要频繁操作String的情况下,请使用StringBuilder。
val builder = new StringBuilder builder.append("Hello") builder.append(", world") builder += '!' builder.insert(0,"Me: ") println(builder) //Me: Hello, world!
3.字面常量:同java。XML扩展。函数常量。
val fun = new Function2[Int, Int, Int] { def apply(x: Int, y: Int): Int = x + y } val result = fun(2,4) println("Result = " + result) result
4.Scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any。统一类型,是Scala的又一大特点。更特别的是,Scala中还定义了几个底层类(Bottom Class),比如Null和Nothing。
()
,这个实例也没有实质的意义。