文章目录
Scala
1 定义变量
var 变量名 = 初始化值
var 变量名:数据类型 = 初始化值
注意:
-
自定义变量的时候需要初始化
-
定义变量的时候不可以指定变量的数据类型,系统会根据变量的初始化值推断变量的数据类型
2 定义常量
val 常量名 = 初始值
val 常量名:数据类型 = 初始值
注意:
-
val 修饰的变量,相当于Java中的final修饰的变量
-
val 修饰的变量,变量的类型的值类型 ,不可修改
-
val 修饰的变量,变量的类型是引用类型,引用不可变,引用的内容可变
val a1 = Array(1,2,3) val a2 = Array(4,5,6) a1 = a2 //不可的,引用不会变 a1(0) = 10 //可以,引用的内容可变
-
val 修饰的变量,还可以用lazy修饰,需要在使用的时候赋值
3 数据类型和操作符
3.1 数据类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LmOrgt3E-1572950512549)(C:\Users\飞扬\AppData\Roaming\Typora\typora-user-images\1570091212665.png)]
- 值类型(Java中的基本数据类型)和引用类型
- 值类型是类类型,相当于java中的包装类,没有基本数据类型和包装类之分
scala> 1 to 10
res1: scala.collection.immutable.Range.Inclusive = Range 1 to 10
scala> 1.to(10)
res2: scala.collection.immutable.Range.Inclusive = Range 1 to 10
3.2 操作符
-
数学运算符
+ - * / %
-
关系运算符
> >= < <= !
-
逻辑运算符
$$ ||
-
位运算符
$ ^ |
-
比较运算符
== !=
-
scala 中的运算符都是方法地 重载,是方法的调用
scala> 1+1 res3: Int = 2 scala> 1.+(2) res4: Int = 3
-
scala中没有++ – 运算符,可以用+= -= 代替
4 表达式
就是一个语句块,包含一条或者多条语句
特点:
- 表达式是有返回值的
- 返回值是表达式中 最后一条语句的执行结果
4.1 条件表达式
if… else语句
scala> val a =1
a: Int = 1
scala> val res = if(a>0) 100 else -100
res: Int = 100
scala> val res = if(a>0) "success" else 100
res: Any = success
scala> val res = if (a>0) 100
res: AnyVal = 100
scala> val res = if(a<0) 100
res: AnyVal = ()
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 = ()
4.2 块表达式
{一条或多条语句}
scala> val res = {10}
res: Int = 10
scala> val res = {val a =10
| val b = 10
| a+b}
res: Int = 20
scala> val res = {var a = 10
| a = 20 }
scala> println(res)
()
scala> val res = {println("aaa")}
aaa
scala> println(res)
()
5 循环
5.1 for循环
for循环的语法:
for(i<- 表达式、数组、集合)
scala> for(i <- 1 to 10){print(i+" ")}
1 2 3 4 5 6 7 8 9 10
scala> for(i <- 1 until 10){print(i+" ")}
1 2 3 4 5 6 7 8 9
scala> val s = "scala"
s: String = scala
scala> for(i<- 0 until s.length)print(i+" ")
0 1 2 3 4
scala> for(i<- 0 until s.length)print(s(i)+" ")
s c a l a
scala> for(i<- s)print(i+" ")
s c a l a
scala> for (i <- 1 to 3;j <- 1 to 3 if (i != j))print(10*i+j+" ")
12 13 21 23 31 32
scala> val res = for(a<- 1 to 10 ) yield a* 10
res: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
5.2 while循环
while 循环的语法:
whilee(条件语句){表达式}
5.3 do while循环
do while循环语法:
do{表达式}while (条件语句)
6 方法
定义语法:
def 方法名 (参数列表):返回类型 = 方法体
返回类型可以省略,但如果该方法是递归类型则不能省略
scala> def add(x:Int,y:Int) = x+y
add: (x: Int, y: Int)Int
scala> def add(x:Int,y:Int):Int = x+y
add: (x: Int, y: Int)Int
scala> add(2,5)
res23: Int = 7
scala> def add(x:Int,y:Int):String={x+y
| println(x+y)}
<console>:12: error: type mismatch;
found : Unit
required: String
println(x+y)}
^
scala> def add(x:Int,y:Int):Unit={x+y
| println(x+y)}
add: (x: Int, y: Int)Unit
scala> add (2,3)
5
6.1 带有参数列表的方法
scala> def addAndMultiply(x:Int,y:Int,z:Int) = (z+y)*x
addAndMultiply: (x: Int, y: Int, z: Int)Int
scala> def addAndMultiply(x:Int)(y:Int)(z:Int) = (z+y)*x
addAndMultiply: (x: Int)(y: Int)(z: Int)Int
scala> add
add addAndMultiply
scala> addAndMultiply(1)(3)(3)
res25: Int = 6
6.2 无参方法
scala> def printInfo = println("I love you")
printInfo: Unit
scala> printInfo
I love you
scala> printInfo()
<console>:13: error: Unit does not take parameters
printInfo()
scala> def printlnfor1() = println("i love you")
printlnfor1: ()Unit
scala> printlnfor1()
i love you
scala> printlnfor1
i love you
6.3 带有默认参数的方法
scala> def printInfo = println("I love you")
printInfo: Unit
scala> print
print printInfo printf println
scala> printInfo
I love you
scala> printInfo()
scala> def printInfo(Str:String= "hello Scala")
| = println(str)
<console>:12: error: not found: value str
= println(str)
^
scala> def printInfo(Str:String= "hello Scala")
| = println(Str)
printInfo: (Str: String)Unit
scala> printInfo()
hello Scala
scala> printInfo("i love scala")
i love scala
scala> def add(a:Int = 1 ,b:Int,c:Int = 3)= println("a="+a+"b+"+b+"c="+c)
add: (a: Int, b: Int, c: Int)Unit
scala> add(2)
<console>:13: error: not enough arguments for method add: (a: Int, b: Int, c: Int)Unit.
Unspecified value parameter b.
add(2)
^
scala> add(1,2)
a=1b+2c=3
6.4 可变长参数方法
scala> def add(a:Int*)={}
add: (a: Int*)Unit
scala> def add(a:Int*)={
| for(i <- a)
| print(a+" ")}
add: (a: Int*)Unit
scala> add(1)
WrappedArray(1)
scala> add(5)
WrappedArray(5)
scala> add(1,2,3,4)
WrappedArray(1, 2, 3, 4) WrappedArray(1, 2, 3, 4) WrappedArray(1, 2, 3, 4) WrappedArray(1, 2, 3, 4)
6.5 方法的嵌套和多态
方法的嵌套:方法体中定义其他的方法
方法的多态:方法可以通过类型实现参数化,类似泛型
import sun.security.util.Length
object methodDemo extends App {
//阶乘
def fatorial(x:Int):Int={
def fact(x:Int,accumlator:Int):Int ={
if (x<=1)accumlator
else fact(x-1,x*accumlator)
}
fact(x,accumlator = 1)
}
println("factorial of 5:"+fatorial((5)))
def listOfDuplicates[A](x:A,length:Int):List[A]={
if (length<1)
Nil
else
x::listOfDuplicates(x,length-1)
}
println(listOfDuplicates(3,6))
}
7 函数的定义
scala> (x:Int,y:Int) => x+y
res40: (Int, Int) => Int = $$Lambda$1396/1305033560@7914c299
scala> val fun=((x:Int,y:Int)=>x+y)
fun: (Int, Int) => Int = $$Lambda$1406/1080343347@4c890e2c
scala> val fun=(_:Int)+(_:Int)
fun: (Int, Int) => Int = $$Lambda$1408/715523797@39225e7c
scala> val fun:(Int,Int) => Int = (_+_)
fun: (Int, Int) => Int = $$Lambda$1409/904306267@2ffccbae
scala> val fun:(Int,Int)=>Int=(x,y)=>x+y
fun: (Int, Int) => Int = $$Lambda$1410/1456405574@4e352a0e
7.1 无参函数
- 小括号不能省略
- 调用时必须写小括号
scala> val fun1 = () => println("haha")
fun1: () => Unit = $$Lambda$1411/1675206863@16b6200
scala> fun1
res46: () &#