1. 程式人生 > >Scala的學習筆記_第一天

Scala的學習筆記_第一天

1.scala

       REPL       //read evaluate print loop

       val                 //常量

       var                 //變數

       typeinfer //型別推斷.

       java語言指令碼化。

2.環境搭建

---------------

      1.下載2.12.1

      2.在win7安裝.

              選擇安裝目錄(不要含有中文和空格目錄).

              自動在path新增scala的bin目錄。

      3.進入scala shell

              執行scala/bin/scala.bat

              cmd>

      4.scala區分大小寫

3.scala常用型別

------------------

       plus()

       Byte               //java.lang.Byte

       Char               //java.lang.Charactor

       Short                     //java.lang.Short

       Int                         //java.lang.Integer

       Long

       Float

       Double

       Boolean

scala>val a = 100 ;               //定義常量

scala>var a = 100 ;               //定義變數

scala>a = 200 ;

scala>val b = "tom"                                   //b:String ="tom"

scala>val b:String = "tom"                   //b:String = "tom"

scala>val a,b,c = 100 ;                         //同時定義多個變數

scala>1.toString()                               //直接轉換成字串

scala>1.toString()                               //直接轉換成字串

scala>1 to 10                                     //建立陣列1..10

scala>1.to(10)                                    //建立陣列1..10

scala>1.to(10)                                    //建立陣列1..10

scala>"hello".intersect("world")      //"lo"

scala>1.toBigInt()                                //使用方法完成型別轉換

scala>var a += 1 ;                              //scala沒有++/--,可以用=+/-=

scala>var a = 1 ;

scala>a += 1 ;

4.REPL

--------------------------------

       read-eval-printloop, or REPL.

       讀   求值  列印  迴圈

5.方法和函式

       方法和型別相關,通過類或物件呼叫。

       函式和類不相關,可以直接呼叫。

scala>import scala.math._     ;             //匯入scala.math包,_相當於*,通配。

scala>val a = sqrt(1)                           //開平方

scala>"hello".distinct                           //去重

6.apply

-------------------

       scala>"hello".apply(4)                                        //取出4號索引位置的字元

       scala>"hello"(4)                                                //簡寫為此.

       scala>BigInt("9999999999999")                          //使用Apply直接構造大數。

       scala>vala = Array(1,'2',"3",4)                            //定義陣列,===Array.apply(1,2,3,4);

       scala>vala = Array(Array(1,2),Array(3,4))             //定義二維陣列,===Array.apply(1,2,3,4);

7.控制結構和函式

       scala的表示式是有返回值的。最後一條語句的返回值.


       scala>valx = 2 ;

       scala>vala = if (x > 1) 1 else -1                  //

       scala>vala = if (x > 1) "1" else -1         //

8.Unit型別

       無有用值得佔位符,表示(),類似於void.

       scala>vala = if (x < 1) 1                             //等價於 val a = if(x < 1) 1 else ()

                                                                      //()是Unit型別,類似於java void型別.

9.貼上模式

       scala>:paste

              //貼上內容

              ctrl+D                                                            //結束

       scala>varr , n = 1 ;

       scala>varx = if(n < 0) {r = r * n ; n -= 1 }

       scala>//this is a demo ;                                                  //註釋

       scala>printf("%d+ %d = %d",100,200 , 100 + 200)        //c語言風格輸出方式

       scala>readLine("yourname")

10.迴圈

       scala>varn = 10 ;

       scala>while(n> 0){

              println(n);

              n-= 1 ;

       }

       //99乘法表

       scala>:paste

       varr = 1 ;

       while(r< 10){

              varc = 1 ;

              while(c< 10){

                     if(c<= r){

                            printf("%dx%d=%d\t",c,r,r*c);

                     }

                     c+= 1 ;

              }

              println();

              r+= 1 ;

       }

       //for迴圈

       scala>valn = 10 ;

       scala>for(i<- 1 to n) println(i)              //

       scala>:paste

       for(i<- 1 to 9){

              for(j<- 1 to 9 ){

                     if(j<= i){

                            printf("%dx%d=%d\t",j,i,i*j);

                     }

              }

              println();

       }

       //break動作

       scala>importscala.util.control.Breaks._ ;    //首先要導包

       scala>:paste

              for(i<- 1 to 10 ){

              println(i);

              if(i== 5){

                     break;

              }

       }

       //for迴圈增強

       scala>for(i<- 1 to 3; j <- 1 to 5) println(i * j );  //前邊迴圈的值乘後邊的

       //守衛條件

       scala>for(i<- 1 to 10 if i % 2 == 0; j <- 1 to 3 if i != j) println(i +"," + j );

       //多個條件的邏輯運算

       scala>for(i<- 1 to 100) {

              if(i% 2 == 0 && i % 3 == 0 && i % 5 == 0){

                     println(i);

              }

       }

       //yield,產生,生成.產生一個集合

       valx = for(i <- 1 to 4) yield i * 2 ;

       for(j<- x){println(x)}

              //執行原理

javac                     java

*.java ------->*.class -----> 

scalac                    scala

*.scala ------->*.class -----> 

11.方法

       針對物件。

12.函式

-------------

def                                            //define定義

scala>:load d:\scala\for99.scala            //載入scala指令碼執行

scala>:help                                        //幫助

scala>def add(a,b) = a + b                  //錯誤,必須給出所有引數型別

scala>def add(a:Int,b:Int) = a + b         // 合法

//遞迴函式

scala>def add(a:Int,b:Int):Int = a + b     //遞迴函式必須顯式宣告返回型別

scala>def fac(n:Int):Int = {

              if(n == 1) 1

                     elsen * fac(n - 1)

       }

//預設引數和命名引數

scala>def decorate(str:String ,left:String = "[" , right:String = "]") = left  + str + right ;           //

預設值

scala>val x =decorate("hello") ;                                              //預設值

scala>val x =decorate("hello","[[","]]]") ;                            //預設

scala>val x =decorate("hello",right="]]") ;                         //命名引數

scala>val x = decorate(left="[[[",str="hello",right="]]") ;//命名引數

java變長引數:

public int sum(int... args){

       ints = 0 ;

       for(inti = 0 ; i < args.length ;  i ++){

              s= s + args[i];

       }

       returns ;

}

public int sum(int... args){

       ints = 0 ;

       for(intx: args){

              s= s + x ;

       }

       returns ;

}

sum(1,2,3)

//變長引數

scala>def sum(args : Int*):Int = {

              vars = 0 ;

              for(x<- args){

                     s= s + x ;

              }

              s;

       }

scala>val x = sum(1,2,3);

scala>val x = sum(1 to 10);                         //錯誤的,1 to 10產生的數字區間.

scala>val x = sum(1 to 10:_*);               //1 to 10產生的數字區間.告知編譯器以數字序列方式對待.相當於統配每一個區間裡面的值

scala>def sum(args:Int*) : Int = {var s= 0 ; for(i <- args){s = s + i ;} s ;}

scala>def sum(args:Int*):Int = {

       if(args.length== 0) 0

       elseargs.head + sum(args.tail:_*) ;

scala>val x = sum(1,2,3,4) ;                  //head : 序列的首個元素,tail:首個元素之後的所有元素.

//過程

//特殊的函式,沒有返回值,{}前沒有等號。

scala>def sayHello{println("helloworld"); 100}                          //過程,返回值是Unit,會有警告

scala>def sayHello={println("helloworld"); 100}                 //函式,返回Int

scala>def sayHello:Int={println("hello world"); return 100}   //函式,返回Int

scala>defsayHello:Int={println("hello world"); return 100}   //函式,如果無引數,可以不帶(),呼叫時不能帶()

scala>defsayHello:Int={println("hello world"); return 100}   //函式,如果無引數,可以帶(),呼叫時()可有可無。

13.//lazy,延遲

scala>lazy val x = scala.io.Source.fromFile("d:\\22.txt").mkString;

scala>x                                      //

14.//異常

throw                                         //拋異常

throws                                        //宣告拋異常

Throwable                                   //異常體系的根類

java.lang.Throwable      

       java.lang.Error               //錯誤

       java.lang.Exception        //異常     RuntimeException

scala>val x = 2 ;

scala>val y = if(x > 0) {

              sqrt(x);

       }

       else

              thrownew IllegalArgumentException("x should not be negative");

try{

       ...

}

catch(AgeTooSmallException e){

       e.println();

}

catch(AgeInvalidException e){

       e.println();

}

try{

       ...

}

catch{

       _  : XxxException => xxx ;                   //=>指向

       ex: YyyyException => ex.xxx

}

15.//定長陣列

scala>Array(1,2,3,4)                            //Array.apply(1,2,3,4);

scala>val a = new Array[Int](10)           //new int[10];

scala>a(0) = 100                                       //賦值,(下標索引)

scala>for(i <- a) println(i) ;                  //迴圈輸出

//字串陣列

scala>Array("hello","world")                 //Array.apply("hello","world");

16.//變長陣列

//ArrayBuffer                                                                  //     陣列緩衝區

scala>importscala.collection.mutable.ArrayBuffer   //導包

scala>val a = ArrayBuffer[Int]()                                  //建立ArrayBuffer()物件.

scala>a += 1                                                                 //追加元素1

scala>a += 2                                                                 //追加元素1

scala>a += (3,4,5)                                                          //追加多個元素

scala>a ++=   Array(6,7,8)                                               //追加集合

scala>a.trimEnd(3)                                                          //濾除最後3個元素

scala>a.trimStart(3)                                                  //濾除開始3個元素

scala>a.insert(index,x1,x2,..)                                      //在指定位置插入若干元素

scala>a.append(5,6,7)                                                     //在末尾追加元素

scala>a.appendAll(Array(1,2,4))                                        //在末尾追加集合

scala>a.remove(3,5)                                                               //刪除指定閉區間的元素

scala>a.toArray                                                                     //將變長集合Buffer變成定長陣列Array

17.//遍歷陣列

scala>val x = 1 until 10                                            //===1.until(10)                  

scala>val x = 1 until (10,2)                                        //===1.until(10)                  

scala>val x = (1 until (10,2)).reverse                           //倒序

scala>val a = Array(1,2,3)

scala>val b = for(i <- a) yield i * 2;                                         //2,4,6

scala>val b = for(i <- a if i %2  == 0) yield i * 2 ;              //加上限制條件

//過濾出偶數元素,再 x 2構成新集合。

scala>a.filter(_ % 2 == 0).map(_ * 2)                                         //

18.//內建演算法函式

scala>a.sum                                                                                        //sum

scala>a.max

scala>a.min   

//排序

scala>val a = ArrayBuffer(1,5,3,4)

scala>a.sorted(_ <  _)                                                                  //??????

scala>val a = Array(1,7,4,6)

scala>scala.util.Sorting.quickSort(a)                                          //ok快速排序

//輸出陣列元素,可以指定字串分隔符

scala>a.mkString("==")                                                                 //

//多維陣列

scala>val a2 : Array[Array[Int]] =  Array.ofDim[Int](3,4) ;    //三行四列

scala>var x = 1 ;

// //二維陣列賦值

       for(i<- 0 until a2.length){//遍歷行

       for(j<- 0 until a2(i).length){//每一行的長度

              a2(i)(j)= x;

              x+= 1 ;

       }

}

19.//Map對映和元組(tuple)

scala>val a =Map("001"->"tom","002"->"tomas","003"->"tomasLee");     //Map[String,String]

scala>val a =Map("001"->"tom",2->"tomas","003"->"tomasLee");           //Map[Any,String]

scala>a("001")                     //tom

scala>a("001")                     //tom,key不存在,異常. java.util.NoSuchElementException: key not found:

scala>val a = newscala.collection.mutable.Map("001"->"tom","002"->"tomas");      //可變map

scala>a.put("004","tomason")                      //

//對偶是特殊的元組,只有兩個元素,key -> value | (key,value) 這就是元組 集合是元組的集合

scala>val a = "001" ->"tom"                             //對偶

scala>val a=("001","tom")                                        //對偶

scala>val a=("001","tom",12)                            //

scala>val a=("001","tom",12,"hebei")                 //

scala>val a=("001","tom",12,"hebei","初中") //

scala>val b =scala.collection.mutable.Map(("id",1),("name","tom"),("age",12))

scala>val m =Map(("id",1),("name","tom"),("age",12))

scala>m.getOrElse("married",0);                        //返回屬性,沒有使用預設值。

scala>m += (("married",false))                           //必須兩個括號,第一個是整體的括號,加兩個屬性就好理解了

scala>m += ("married" ->false)                               //

scala>m -= "id"                                                             //可變Map 需要導包cala.collection.mutable.Map

scala>m - "id"                                                        //不可變集合

20.//迭代map

scala>for((k,v) <- b) println(k +"==>" + v) ; //

scala>for((k,v) <- m) println(k +"==>" + v) ;       //

scala>for(k <- b.keySet) println(k) ;                    //

scala>for(v <- b.values) println(v) ;                     //

21.//排序map SortedMap

scala>val mm =scala.collection.immutable.SortedMap("alice"->100,"bob"->98,"aaming"->101)

scala>for((k,v) <- mm) println(k +":" + v) ;   //有序排列  按照K排序

22.//和java的互相訪問

scala>importscala.collection.JavaConversions.mapAsScalaMap          //匯入轉換包

scala>val m:scala.collection.mutable.Map[String, Int] = new java.util.TreeMap[String, Int]

23.//scala轉java map

scala>importscala.collection.JavaConversions.mapAsJavaMap

scala>importjava.awt.font.TextAttribute._

scala>val attrs = Map(FAMILY ->"Serif", "" -> 12)                    //scala集合

scala>val font = newjava.awt.Font(attrs)                                         //自動轉換成java集合

//元組,*****下標從1開始 *******

scala>val t = (1,"tom",12)

scala>t._2                                                 //"tom"  //注意”.” 元組得到訪問方式

//宣告元組型變數,分別提取元組的各個欄位值。

scala>val id = t._1   //注意”.” 元組得到訪問方式

scala>val name = t._2

scala>val (id,name) = t  //相當於上面的兩部分的合成體

//zip操作拉鍊操作(咬合操作)

scala>val wifes =Array("wife1","wife2","wife3");

scala>val hus =Array("hus1","hus2","hus3");

scala>val home = wifes.zip(hus);

24.類

scala>class Counter{

       privatevar value = 0 ;                  //欄位必須初始化

       definrement() = value += 1         //複製,沒有返回值,Unit

       defcurrent() = value                    //有值,Int

}

scala>val c = new Counter();   //建立物件

scala>c.inrement()                       //

scala>c.current()

//反編譯之後的原始碼

public class Person {

 public int age();    //get方法

 public void age_$eq(int);   //set方法

 public Person();          //構造方法

}

//

scala>class Person{

       privatevar age = 0 ;                    //欄位始終私有

       defage:Int = age ;

}

25.使用scala編譯指令碼

      //1.編寫scala檔案

       [Person.scala]

       classPerson{

              varage = 0 ;

       }

      //2.編譯scala檔案

       scalacPerson.scala

      //3.生成class檔案

       Person.class

      //4.通過javap檢視類

       javap-private Person.class

//變數使用範圍

//private[this]                                                   //只能本類的一個成員使用

//private[Person]                                                      //可以Person的成員使用

class Person{

       privateint age ;

       publicboolean equals(Person p){

              returnthis == p.age ;

       }

}

//限制只能在物件中訪問。

class Car{

       varcolor : String = "black";

       defisCable(o:Engine) = o.rate > 100 ;   //當前一個物件訪問。

       classEngine{

              private[Car]var rate = 100 ;          //在外部類可以訪問

              defcolor = Car.this.color ;

       }

}

//scala的bean屬性

scala>import scala.beans.BeanProperty

scala>class Dog{

       @scala.beans.BeanProperty

       varname:String = "dahuang" ;

}

scala>var d1 = new Dog();

scala>d1.getName()

scala>d1.setName("dd")

//scala的語法

scala>d1.name

scala>d1.name = "" ;

scala>d1.name_=("ccc");

//構造,主構造和輔助構造

scala>class Person{

       privatevar name:String = "" ;

       privatevar age:Int = 0 ;

       //定義輔助構造

       defthis(name:String){

              this();              //主構造

              this.name= name ;

       }

       //輔助構造

       defthis(name:String,age : Int){

              this(name);//呼叫前一個輔助建構函式

              this.age= age ;

       }

}

//構造,主構造和輔助構造

scala>class Person2(val name:String ,private var age : Int){

       //定義輔助構造

       defthis(name:String){

              this();              //呼叫主構造

              this.name= name ;

       }

       //輔助構造

       defthis(name:String,age : Int){

              this(name);

              this.age= age ;

       }

}

//定義

class Person(val name:String , private varage : Int){

       //輔助構造

       defthis(name:String,age : Int,desc:String){

              this(name,age);

              println(desc);

       }

       //輔助構造

       defthis(){

              this("tom",12);

              println("hhh");

       }

}

//主建構函式引數不加val或者var修飾,只要有一個方法訪問,則轉變成private[this]欄位。

//name程式設計成員變數。final修飾的,預設修飾是val的。

scala>class Person(name :String,age:Int){

       defkk = name ;

}

//Object等價於java的靜態

//定義的final+static成員.

26.//半生物件,將類中靜態成分抽象出來,存放在半生物件中。

scala>class Benz{

       defcolor = "black" ;

}

scala>object Benz{   //Benz的伴生物件,不是單獨的一個類專門寫靜態方法

//Object等價於java的靜態

       defbrand = "BENZ" ;

}