1、for循环格式
for(i <- 1 to 10){print(i)}
2、懒加载 lazy val a = 1; 直到用时才会加载
3、方法的声明格式 def(x:Int,y:Int) : Int ={} 最后一个冒号后面是返回类型,不加则没有返回值
4、默认参数 def loadConf(conf : String = "default"){ print(conf)} 如果不传入参数 ,则默认使用default的数值
5、变长参数 def sun(elems: Int*){ } 可以传入 更多的参数
6、异常处理 scala 使用了模式匹配
try{
}catch{
case e: Exception => System.err.print(e)
case_ => //should never happen
}finally {
}
7、定长数组 val array_name = new Array[String](5),也可以 val a = Array("Jack","Lucy") 直接指定String类型的初始化值
8、变长数组 val a = scala.collection.mutable.ArrayBuffer[Int]() a+=1 a+=2 a+=(3,4,5) a++= Array(6,7,8) 就可以将数值甚至数组加入数组
也可以使用insert a.insert(num) , a.remove(num); a.toArray 就是将变长数组变成定长数组 然后再可调用sum max min 等#
a.trimEnd(num) 可以将后num个数去掉
9、遍历数组
val a = Array(1, 2, 3, 4, 5, 6, 7, 8)
for (elem <- a) {
println(elem)
}
for(i <- 0 until a.length){
print(a(i))
}
10、Map(可变和不可变)
val age = Map("Jack" -> 20,"Lucy" -> 18)
//获取key为Jack的值age("Jack")
//倘若不存在,则会报错,所以用 age.getOrElse("Jack",0) 如果不存在,则默认赋予一个值 或者使用age.get("Jack") 不过如果不存在值,获取的为null
//插入元素可以使用 age("aa") = 2 则会将key为aa,值为2的值插入age的Map中 age += ("BB" ->3,"CC" ->4) 删除 直接 age -="AA"
//迭代map
val m = Map("jack" -> 20,"BB"-> 3,"CC" -> 4,"Lucy" ->18)
for((k,v) <- m){
println("key is" + k + ",value is " + v)
}
//只获取key的集合 m.keySet 只获取value的集合 m.values
11、元祖 val a = (1,3,4,5,6,8) 访问方式 下标从1开始。 a._1 就表示第一个元素
Scala面向对象
object Basic2 {
def main(args : Array[String]){
val p = new Person //没有参数的对象 可以不加()
p.name = "Jack"
println(p.name +":"+p.age)
val p = new Person("Jacky",20,"male")
print(p.name +":" + p.age + ":" + p.gender)
}
}
class Person{
var name : String = _ //没有参数 会自动生成getter和setter方法
val age = 10 //这种只会生成getter方法
}
//主构造器 直接跟在类名后面,朱构造器中的参数,最后会被编译成字段。
//朱构造器执行的时候,会执行类中的所有语句
//假设参数声明时不带val和var,那么相当于private[this]
val p = new Person("Jacky",20)
print(p.name +":" + p.age)
class Person(val name:String,val age :Int){
println("this is the primary constructor!")
}
class Person(val name:String,val age :Int){
println("this is the primary constructor!")
var gender : String = _
//附属构造器名称为this,每一个附属构造器必须先调用已经存在的子构造器或者附属构造器
def this(name : String,age : Int,gender : String){
this(name,age)
this.gender = gender
}
抽象类
trait 接口中可以写实现类
trait ConsoleLogger{
def log(msg : String): Unit ={
println("save money:" + msg)
}
}
trait MessageLogger extends ConsoleLogger{
override def log(msg : String): Unit ={
println("save money to bank" + msg)
}
}
abstract class Account{
def save
}
class MyAcount extends Account with ConsoleLogger{
def save: Unit ={
log("100")
}
Apply 静态的方法可以定义一个object 就为静态方法 Scala中没有static关键字
class ApplyTest {
def apply() = "APPLY"
def test: Unit ={
println("test")
}
}
object ApplyTest{
def static: Unit ={
print("i'm a static method")
}
def apply() = new ApplyTest
}
object Basic4 extends App{
//ApplyTest.static
//在调用ApplyTest的时候 已经new了
val a = ApplyTest()
//调用的是 object的方法
a.test
val t = new ApplyTest
//调用的是类的apply方法
print(t())
模式匹配
val value = 1
val result = value match{
case 1 => "one"
case 2 => "two"
// _代表了通配符 所以不需要break
case _=> "some other number"
}
println("result of match is :" + result)
val result2 = value match{
case i if i==1 =>"one"
case i if i==2 =>"two"
case _ => "some other number"
}
文件读取
val file = Source.fromFile("/usr/local/yangsiyi.txt")
for(line <- file.getLines()){
println(line)
}
获取网络内容 适用于爬虫
val file1 = Source.fromURI("http://www.baidu.com")
这种方式是按字符打印
for(c <- file){
println(c)
}
字符串追加
val a = "Yes"
s"$a, I Do !"
print(s"$a, I Do !")
private[Spark] 表示只能在此包里面访问