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>