scala语法

1:双重for循环(相当于j是i的内存循环):for (i <-0 to n; j <-10 to 20){ println(i);println(j)}

2:单层for循环:for (i <-0 to n) print(i)

3:单层for循环(不包含上限):for (i <-0 until n) print(i)

4:break需要借助breakable:

  

import scala.util.control.Break._
n=10
breakable {

  for (i <- 0 until n) {
    if (i==5) break; //退出breakable块
    print(i)
  }
}

 5:函数:(列表参数和普通参数)

def test(a:Int=123,b:String="zzq"):Int={//参数:参数类型=参数默认值):函数返回值

 if(a>123){
    print("年龄:"+a)
 }else{
    print("年龄:"+a+"  姓名:"+b)
 }
 var sum=100;
 sum //返回值
}

//调用 test1(1 to 5:_*) 这样就形成了1~5的集合
def test1(c:Int*)={
 var sum=0;
 for(item <- c){
    sum+=item
 }
 sum //返回值
}

 6:类的定义

class Test1{//类定义
private var t1=0

def getT1=t1

def getT1_=(newV:Int){
    t1=newV
}
}

//主构造函数需要在类外部声明(如果构造函数传递的参数在内部其它方法中使用,则会变成private[this]这样的绝对私有变量)
class Test1(new1:Int=123,new2:String="abc"){ print(new1+"   --   "+new2)}

 7:伴生类和伴生对象在同一个文件中可以相互访问private field变量

object Test2{//一般用作静态方法访问的静态类,可理解为单例
private var _i=10
print("执行一次")
def getI=_i
def apply=new Test2("cba")//spark中大量使用伴生类重写apply方法来进行class对象的隐式创建方式 }
class Test2(a:String="abc"){ print(a+" -- "+Test2._i) } //执行结果 scala> Test2.getI 执行一次res10: Int = 10 scala> Test2.getI res11: Int = 10 scala> var yy=new Test2("kkk") kkk -- 10yy: Test2 = Test2@2fe88a09

 8:枚举值

//scala中的枚举值

object Em extends Enumeration{
 val or= Value(0,"or")
 val and= Value(1,"and")
 val where= Value(2,"where")
}

//按索引标记取值:Em(0)

//按枚举名称标记取值:Em.withName("where")

//遍历:for(ele<- Em.values) print(ele)

 9:继承:

class T1{

final def abc(){
println("这是abc")
}

def abc1(){
println("这是abc1")
}

final var abc2=123
val abc3=1234//只有这种val才能被覆盖

}



class T2 extends T1{
override val abc3=990

override def abc1(){
println("这是重写的abc1  ")    
}
}

 10:类型判断

//模糊判断类型
scala> t2.isInstanceOf[T1]
res14: Boolean = true

scala> t2.isInstanceOf[T2]
res15: Boolean = true

//精确判断类型
scala> t2.getClass==classOf[T2]
res17: Boolean = true

scala> t2.getClass==classOf[T1]
res18: Boolean = false

 11:scala中的模式匹配

//传入的参数,但判断类型时实际使用的是isInstanceOf[xxx]
def getNum(item:Any)={
 item match{
     case x:String => print("String")
     case i:Int => print("Int")
     case c:Char => print("Char")
     case _=>0//这个是完全没有匹配上的情况
 }
}

def testMatch(i:Int,s:String="default"):Unit={
 i match {
  case 1 => print("数字:"+1)
  case 2 => print("数字:"+2)
  case 3 => print("数字:"+3)
  case 5 if(s equals "mz") => print("数字:"+3+"mz")//匹配后仍可添加判断
  case tmp1 => print("tmp1的赋值数字:"+tmp1)//会将i赋值给tmp1变量
  case _ => print("其它喽")
 }
}

12:triat可以多继承,其中可以有实现方法和未实现的抽象方法,但一般triat用于书写工具方法,在不同级别的实现类中去override,而且多重继承后会有责任链的特性

trait Log{
var t:Int def wlog(name:String){} } trait MyLog
extends Log{
override var t=100//继承了Log的traint则必须要初始化 override def wlog(name:String){ print(
"MyLog ->"+name) super.wlog(name) } } trait MyLog1 extends Log { override def wlog(name:String){ print("MyLog1 ->"+name) super.wlog(name) } } class P extends MyLog with MyLog1 {//调用链按照继承顺序,构造函数的调用也是按照继承顺序,以此类推(如果有同一父trait被多次继承则构造函数仅仅调用1次) def get(){ wlog("开始调用 ") } }

 

posted @ 2018-03-20 13:34  soft.push("zzq")  Views(306)  Comments(0Edit  收藏  举报