1、无参函数调用时可以直接使用函数名调用,而不必须带后面的括号(通常不带函数名后面的括号)。
2、scala中得try-catch-finally语句块跟java有点区别,catch语句里面用case语句来区分不同类型的异常,catch语句是用{}包裹。
def exFunction(): Unit = {
val n = 99
try {
val half = if (n % 2 == 0) n / 2 else throw new RuntimeException("N must be event")
} catch {
case e : Exception => println("The exception is :" + e.getMessage)
} finally {
println("execute finally")
}
}
3、元组(tuple)可以容纳不同类型的对象,当一个函数有多个返回值时可以用元组返回。tuple的遍历。注意tuple构造方法。
val triple = (50, "Scala", "java")
triple.productIterator.foreach(i => println(i))
4、数组(Array),构造数组对象及遍历数组。
val arr = Array(1, 2, 3, 4)
for (i <- arr) {
println(i)
}
5、映射(Map)构造方法及遍历。遍历Map时可以使用元组来接收k、v,不需要取值的可以使用占位符来替代。
val infos = Map("xiaoming" -> 23, "xiaobai" -> 26)
for ((k, v) <- infos) {
println(k + ":" + v)
}
for ((k, _) <- infos) {
println("key:" + k)
}
6、读文件与读取网页内容
// val file = Source.fromFile("D:\\hello.txt")
val file = Source.fromURL("http://www.yiibai.com/scala/scala_collections.html")
for (line <- file.getLines()) {
println(line)
}
7、scala中函数就是一个值,所以可以把函数作为参数传递给另一个函数。通过=>来指定匿名函数的实现,匿名函数在spark中应用很多,如map和flatMap函数等
8、递归函数一定得指定返回值类型。不指定会报错。
def factorial(n : BigInt) : BigInt = {
if (n <= 1)
1
else
n * factorial(n - 1)
}
9、lazy修饰变量实现延迟加载。lazy修饰的变量,只有在变量第一次被使用时才会被实例化。
lazy val file = Source.fromFile("D:\\hello.txt")
10、scala和java一样也支持可变参数。可变参数需要在函数参数的末尾加*
def sum(args : Int*): Unit = {
var result = 0
for (i <- args) result += i
println("result = " + result)
}
11、scala具有强大的类型推断能力。如果声明和初始化是在一步完成则不需要指定数据类型,可由编译器自行推断出数据类型。如果只是声明而没有初始化,则需要指定数据类型。
val nums = new Array[Int](10)
val a = new Array[String](10)
val s = Array("hello", "world")
12、scala中的Array和ArrayBuffer。Array是定长数组,ArrayBuffer是可变数组。
13、根据下标取Tuple里面的某个元素的三种方法。
val tuple = (3, 4, 5, "java", "scala")
val (first, second, third, fourth, _) = tuple //模式匹配,可以“_”来占位
val third = tuple._3
val three = tuple _3
14、根据条件对Array中每个元素进行处理的三种操作方式。
val c = Array(2, 3, 5, 7, 11)
for (elem <- c if elem % 2 == 0) yield 2 * elem
c.filter(_ % 2 == 0).map(_ * 3)
c.filter(elem => elem % 2 == 0).map(x => x * 5)
15、zip函数用来关联两个两个数组。
val sysmbols = Array("<", "-", ">")
val nums = Array(1, 3, 5)
val pairs = sysmbols.zip(nums)
for ((x,y) <- pairs) print(x + y)
16、scala源文件中可以有多个public类,java一个源文件中只能有一个public类(内部类除外)。scala中class如果不带权限修饰符则默认是public类型的。
17、scala类中声明一个字段,默认是private的,并且scala编译器会默认生成getter、setter方法。而java中需要手动声明为private并且添加getter、setter方法。
18、var声明的字段会带有getter、setter,而val声明的对象只生成getter方法,没有setter方法。private[this] var gender = 0 这样的语法是scala特有的,对象私有属性,这种属性只有本对象可以访问,该类的其他对象不能访问。通过这种机制实现实例成员的隔离。
19、一个类中使用var声明一个字段,默认提供getter、setter方法。前面加上修饰符private则默认不提供getter、setter方法。