scala入門(一)

scala入門(一)

數據類型 變量名;
數據類型 變量名 = 初始化值;
scala 定義變量
var 變量名 = 初始化值
var 變量名:數據類型=初始化值
var a=1
定義變量的時候需要初始化值
定義變量的時候可以不指定變量的數據類型,系統會根據變量的初始化值推斷變量的數據類型
scala定義常量
val 變量 =初始化值
val 變量:數據類型=初始化值
val修飾的變量,相當於java中final修飾的變量
val 修飾的變量,變量的類型的值類型(相當於java的基本數據類型,Int DOUBLE);值是不可以修改的

  var a=10
  a=100//不可以
  val修飾的變量,變量的類型是引用類型,引用不可變,引用的內容可變
  val a1=Array(1,2,3)
  val a2=Array(4,5,6)
  a1=a2//不可以,引用不可變
  a1(0)=10 //可以,引用內容可變
  val的變量還可以用lazy修飾,值在需要獲取或使用的時候賦值
  lazy val a =100
  
 

val ? var
官方推薦使用val
數據類型和操作符
數據類型
值類型和引用類型
值類型是類類型,相當於java的包裝類,沒有基本數據類型和包裝類之分

操作符

數學運算符:±/* %
關係運算符:>>=<<=!
邏輯運算符:&&||
位運算符:&|^
比較對象:== !=
(1)scala中的運算符都是方法的重載,是方法的調用
(2)scala中沒有++ --運算符,可以用+= -=來代替

表達式

就是一個語句塊,包含一天或者多條語句

特點

(1)表達式是有返回值得

(2)返回值是表達式中最後一條語句的執行結果、

條件表達式

含有if/else的語句塊

scala> val res = if(a>0) "success" else -100
res: Any = success
scala> val res = if(a>0) "success" else "wqe"
res: String = success
//缺失else的表達式
scala> val res = if(a>0) 100
res: AnyVal = 100
scala> val res = if(a<0) 100
res: AnyVal = ()//unit類型
scala> val res =if(a>0) 100 else if(a>0) -100 else 0
res: Int = 100
scala> val res = if(a<0) 100 else()
res: AnyVal = ()

塊表達式

{一條或多條語句}

scala> val res ={val a=10
     | var b =20
     | a+b
     | }
res: Int = 30
scala> val res ={var a=10
     | a =20 }
scala> println(res)
()
scala> val res ={println("asd")}
asd
scala> println(res)
()

循環語句

for:

for(i <- 表達式、數組、集合)
scala> for(i <- 1 to 10){println(i)}
1
2
3
4
5
6
7
8
9
10

scala> for(i <- 1 to 10)println(i)
1
2
3
4
5
6
7
8
9
10

scala> for(i <- 1 until 10)println(i)
1
2
3
4
5
6
7
8
9

scala> 1 to 10
res5: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> 1 until 10
res6: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> for(i <- 0 until s.length)println(s(i))
s
c
a
l
a
scala> for(i <-  s)println(i)
s
c
a
l
a
scala> for(i <- 0 until s.length)println(s.charAt(i))
s
c
a
l
a
scala> for (i <- 1 to 3;j <- 1 to 3 if(i!=j))println(10*i+j)
12
13
21
23                                                                   
31
32
scala> var res=for (i <- 1 to 10 )yield i*10
res: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
scala> for (i <- 1 to 3){
     | if(i==3){
     | println(3)}
     | for (j <- 1 to 3){
     | if(i != j ){
     | println(i*10+j)}
     | }
     | }
12
13
21
23
3
31
32

while

while(條件語句){表達式}
scala> var i =1
i: Int = 1
scala> while(i < 3){println(i)
     | i+=1
     | }
1
2

do while

do {表達式}while{條件語句}

方法

定義語法

def 方法名 (參數列表): 返回類型(可省略,遞歸不可省略) = 方法體(表達式)

返回類型在方法是遞歸方法的時候,一定要指明,其他情況,可以省略

scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Int

scala> add(1,2)
res1: Int = 3

scala> add(x=1,y=2)
res2: Int = 3

scala> var c = add(x=2,y=8)
c: Int = 10

scala> print(c)
10
scala> def add(x:Int,y:Int):Unit={x+y
     | print(x+y)}
add: (x: Int, y: Int)Unit

scala> add(1,2)
3

帶有參數列表的方法

scala> def addAndMultiply(x:Int,y:Int)(z:Int)=(x+y)*z
addAndMultiply: (x: Int, y: Int)(z: Int)Int

scala> def addAndMultiply(x:Int)(y:Int)(z:Int)=(x+y)*z
addAndMultiply: (x: Int)(y: Int)(z: Int)Int

scala> def addAndMultiply(x:Int,y:Int,z:Int)=(x+y)*z
addAndMultiply: (x: Int, y: Int, z: Int)Int

scala> def addAndMultiply(x:Int,y:Int,z:Int)=(x+y)*z
addAndMultiply: (x: Int, y: Int, z: Int)Int

scala> addAndMultiply(3)(4)(5)
<console>:9: error: not enough arguments for method addAndMultiply: (x: Int, y: Int, z: Int)Int.
Unspecified value parameters y, z.
              addAndMultiply(3)(4)(5)
                            ^

scala> def addAndMultiply(x:Int)(y:Int)(z:Int)=(x+y)*z
addAndMultiply: (x: Int)(y: Int)(z: Int)Int

scala> addAndMultiply(3)(4)(5)
res6: Int = 35

scala> def addAndMultiply(x:Int,y:Int,z:Int)=(x+y)*z
addAndMultiply: (x: Int, y: Int, z: Int)Int

scala> addAndMultiply(3,4,5)
res7: Int = 35

​ 無參方法

scala> def printInfo=println("i love scala")
printInfo: Unit

scala> printInfo
i love scala

scala> printInfo()
<console>:9: error: Unit does not take parameters
              printInfo()
scala> def printInfo()=println("i love scala")
printInfo: ()Unit

scala> printInfo
i love scala

scala> printInfo()
i love scala

帶有默認值參數的方法

scala> def printInfo(str:String="helo scala")=println(str)
printInfo: (str: String)Unit

scala> printInfo("asdsa")
asdsa

scala> printInfo()
helo scala
scala> def add(x: Int=1,y:Int,z:Int=3)=println("x="+x,"y="+y,"z="+z)
add: (x: Int, y: Int, z: Int)Unit

scala> add(1)
<console>:9: error: not enough arguments for method add: (x: Int, y: Int, z: Int)Unit.
Unspecified value parameter y.
              add(1)
                 ^

scala> add(1,2)
(x=1,y=2,z=3)

scala> add(2,2,2)
(x=2,y=2,z=2)

scala> add(y=2)
(x=1,y=2,z=3)

可變長參數方法

scala> def add(a:Int*)={
     | for(i <- a)
     | println(a)}
add: (a: Int*)Unit

scala> add(1)
WrappedArray(1)

scala> add(1,2)
WrappedArray(1, 2)
WrappedArray(1, 2)
scala> def add(a:Int*)={
     | for(i <- a)
     | println(a(i-1))}
add: (a: Int*)Unit

scala> add(1)
1

scala> add(1,2,3,4)
1
2
3
4

scala>

函數

scala> (x:Int,y:Int)=>x+y
res18: (Int, Int) => Int = <function2>
scala> res18(1,2)
res22: Int = 3

scala> val fun = (x:Int,y:Int)=>x+y
fun: (Int, Int) => Int = <function2>

scala> fun(1,2)
res23: Int = 3
scala> val fun=((x:Int,y:Int)=>x+y)
fun: (Int, Int) => Int = <function2>

scala> val fun=(_:Int)+(_:Int)
fun: (Int, Int) => Int = <function2>
scala> val fun:(Int,Int)=>Int=(_+_)
fun: (Int, Int) => Int = <function2>

scala> val fun:(Int,Int)=Int=(x,y)=>x+y
<console>:7: error: reassignment to val
       val fun:(Int,Int)=Int=(x,y)=>x+y
                            ^

scala> val fun:(Int,Int)=>Int=(x,y)=>x+y
fun: (Int, Int) => Int = <function2>

scala> val fun =new Function2[Int,Int,Int]{
     | def apply (x:Int,y:Int)=if(x<y)x else y
     | }
fun: (Int, Int) => Int = <function2>

scala> fun(1,2)
res25: Int = 1

scala> val fun =(x:Int,y:Int)=>if(x<y) x else y
fun: (Int, Int) => Int = <function2>

scala> fun (1,2)
res26: Int = 1

無參函數

scala> val fun1 = () =>println("java and scala")
fun1: () => Unit = <function0>

scala> fun1()
java and scala

scala> fun1
res28: () => Unit = <function0>

多參函數

scala> val fun2=(x:Int,y:Int) => x*y
fun2: (Int, Int) => Int = <function2>

scala> fun2(2,3)
res31: Int = 6

scala> fun2(x=2,y=3)
<console>:9: error: not found: value x
              fun2(x=2,y=3)

函數與方法的區別於聯繫

區別:

1.方法和函數定義的語法不同

2.方法一般定義在類,特質,或者object中

3.方法可以共享所在類、特質、或者object中的屬性

4,可以調用函數,也可以存在到一個變量中,作爲參數傳遞給其他的方法或者函數,也可以作爲返回值

聯繫:

1.可以把函數作爲參數傳遞給方法

scala> def m(f:(Int,Int)=>Int)=f(5,1)
m: (f: (Int, Int) => Int)Int

scala> val f =(x:Int,y:Int)=>x-y
f: (Int, Int) => Int = <function2>

scala> m(f)
res36: Int = 4

2.方法可以轉換成函數

a,把一個方法作爲參數傳遞給其他方法或函數

b,使用方法名加空格加下劃線把方法顯示的轉換成函數

scala> def m2(x:Int,y:Int) = x-y
m2: (x: Int, y: Int)Int

scala> m(m2)
res37: Int = 4

scala> m(m2 _)
res38: Int = 4

scala>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章