1.条件表达式
object ConditionDemo { def main(args: Array[String]) { val x = 1 //判断x的值,将结果赋给y val y = if (x > 0) 1 else -1 //打印y的值 println(y) //支持混合类型表达式 val z = if (x > 1) 1 else "error" //打印z的值 println(z) //如果缺失else,相当于if (x > 2) 1 else () val m = if (x > 2) 1 println(m) //在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void val n = if (x > 2) 1 else () println(n) //if和else if val k = if (x < 0) 0 else if (x >= 1) 1 else -1 println(k) } }
2.块表达式
val result = { if (x < 0){ -1 } else if(x >= 1) { 1 } else { "error" } }
块表达式中一般最后一个参数就是表达式的返回值。
3.循环语句
for循环 1 to 10 ,to是一个方法,是将1到10数据产生
for的格式1: for(i <- res1)object ForDemo {
def main(args: Array[String]) { //for(i <- 表达式),表达式1 到 10返回一个Range //每次循环将区间中的一个值赋给i for (i <- 1 to 10) println(i) //for(i <- 数组) val arr = Array("a", "b", "c") for (i <- arr) println(i) //高级for循环 //每个生成器都可以带一个条件,if前面没有分号 for(i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ") println() //for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合 //每次迭代生成集合中的一个值,将i的值进行操作,将数据装入vector中。如果对数组进行操作,最后结果返回一个数组。 val v = for (i <- 1 to 10) yield i * 10 println(v)
} }
练习:将一个1到9的数据中的偶数取出来。
//使用val更加的节省资源 val a1=Array(1,2,3,4,5,6,7,8,9) val a1=for(i<- a1;if(i%2==0)) yield i
练习:filter过滤
a1.filter(_%2==0)
_表示每次输出的值
for循环通过角标开始
for(i <- 1 to a1.length) println(a1(i-1))
for(i <- 1 until a1.length) println(a1(i))
to是[]的操作,until是(]的操作
1 to 10 等同于 1.to(10)
5.在scala中是不存在操作符运算的,运算的底层都是使用方法来完成的。
scala>1-3 res1:Int = -2 scala>1.-(3) res2:Double = -2.0
对于为什么返回的是一个double,这是因为它将第一个1当做是double运算的,所以后来大印的就是double。
测试方法:将3定义成一个val a的值,1.-(a)结果仍为double,将1定义为一个val b的值,a.-(b)结果是int。
在源码中,方法的返回的类型和输入的参数是和传入参数有关的。
6.方法和函数
方法定义 def 方法名(参数列表):返回值类型 = 操作
方法定义: def m1(a:Int,b:Int):Int = x*y 方法调用 m1(3,5) 不写返回值的类型 def m1(a:Int,b:Int) = x*y 注意:但是递归是必须要有返回值类型的。
7.函数定义
定义一个函数,无名函数 (x:Int,y:Int)=>{x+y} 有名函数 val f1=(x:Int,y:Int)=>{x+y} 调用 f1(参数)
8.函数有一个特性就是可以作为参数传入到方法里面。
定义一个函数 val f3=(x:int)=>x*10 准备一个数组,将数组的值进行函数f3的操作 val a1=Array(1,2,3,4,5,6,7,8,9) a1.map(f3)
这也就是说函数式编程可以将数据的进行任意操作,这也是他的灵活性。
9.方法是通过方法名进行调用,函数是可以作为参数进行传递的。
10.a1.map(_*100) 将a1中数据乘以10.这个是不定义函数,也可以定义匿名函数
匿名函数 a1.map((x:Int)=>x*100)
但是在a1中的参数都是知道的,这个时候就不需要指定数据的类型
a1.map(x=>x*10)
当然了最简单的方式是
a1.map(_*100)
11.下划线的作用
将方法转化为函数,如果一个函数的逻辑和方法的逻辑相同,那么就可以使用下面的方法将方法转换为函数。
def testZhanshu(x:Int,y:Int):Int = { X+y; }
将上面的方法转换为函数
Val fun2 = testZhanshu_
总结:
函数和方法的最大区别在于,函数可以作为参数进行传递。
定义函数的方式
Val fun=(x:Int,y:Int)=>操作 Val fun1 = (x:Int,y:Int)=>返回值[可以为任意的,可以是一个元祖 返回值类型是可以设置的,也可以不需要设置的,因为元函数的返回值是可以自己推断出来的。] ={操作} Val fun2:(Int,Double)=>(Double,Int)={(x,y[因为只是将前面数据的定义了,但是并没有定义变量,所以这里的需要将变量定义出来。])=>具体的业务逻辑} 递归必须有返回值类型的 加入说没有返回值的时候,这个时候返回值是Unit,调用之后,返回值是一个()