Scala进阶实战
包和引入
Scala的包和Java中的命名空间的目的是相同的。
package spark.navigation {
abstract class Navigator{
def act
}
}
package tests {
//spark.navigation.tests
class NavigatorSuite
}
//相同作用域的包对象可以直接访问
package object people {
val defaultName = "Scala"
}
package people {
class people {
var name = defaultName
}
}
//隐式引用的包
import java.lang._ //java.lang包里的所有东西
import scala._ //scala包里的所有东西
import Predef._ //Predef对象里的所有东西
访问权限
private[package] 访问权限给予package包内的所有方法和对象。
protected[package] 访问权限给予package包内的所有方法和对象还有对象的子类。
package spark{
package navigation{
private[spark] class Navigator{
protected[navigation] def useStarChart() {}
class LegOfJourney {
private[Navigator] val distance =100
}
private[this] var speed = 200
}
}
package launch{
import navigation._
object Vehicle {
private[launch] val guide = new Navigator
}
}
}
文件读写
//打开文件
val file = Source.fromFile("E:\\WangJialin.txt")
for (line <- file.getLines){ println(line)}
file.close
//加载html
val webFile = Source.fromURL("http://spark.apache.org/")
webFile.foreach(print)
webFile.close
//写入文件
val writer = new PrintWriter(new File("scalaFile.txt" ))
for (i <- 1 to 100) writer.println(i)
writer.close()
正则表达式
val regex="""([0-9]+) ([a-z]+)""".r
val numPattern = "[0-9]+".r
val numberPattern = """\s+[0-9]+\s+""".r
//findAllIn方法返回遍历所有匹配项的迭代器
for (matchString <- numPattern.findAllIn("99345 Scala, 22298 Spark")) println(matchString)
//找到首个匹配项
println(numberPattern.findFirstIn("99ss java, 222 hadoop"))
val numitemPattern="""([0-9]+) ([a-z]+)""".r
//模式匹配
val numitemPattern(num, item) = "99 hadoop"
val line = "93s459 spark"
line match{
case numitemPattern(num, blog) => println(num + "\t" + blog)
case _ => println("Oops...")
}
内部函数
//argument 10 "E:\\test.txt"
def processData(filename: String, width: Int) {
def processLine(line: String) {
if (line.length > width)
println(filename +": "+ line)
}
val source = Source.fromFile(filename)
for (line <- source.getLines)
processLine(line)
}
偏函数
def sum(a : Int, b : Int, c : Int) = a + b + c
println(sum(1, 2, 3))
val fp_a = sum _
println(fp_a(1, 2, 3))
println(fp_a.apply(1, 2, 3))
val fp_b = sum(1, _: Int, 3)
println(fp_b(2))
println(fp_b(10))
闭包
def add(more : Int) = (x : Int) => x + more
val x = add(1) //匿名函数(x : Int) => x + 1
val y = add(2) //匿名函数(y : Int) => x + 2
println(x(10))
println(y(100))