Scala:
1.def 方法名(参数名:参数类型,…):返回值类型={方法体},在Scala中,每个句子是不用以分号结束的。
def add():Unit={...} 在调用方法的时候,如果该方法没有参数,可以省略括号,如: add // 加上括号也没事,如 add() 2.条件表达式: val res = if(x > 7) 1 else 0 3.scala中的while和do-while用法和其它语言是一样的,但是for的用法就不同了 for(i <- 表达式){ 循环体 } for(i <- 0 to arr.length){ println(arr[i]) } // 同时也可以当foreach使用 for(i<- arr){ println(i) } for(i<- 0 to 10 if i%2==0){ println(i) //for循环里可以添加if判断语句的,scala的循环表达式中没有break和continue,但可以通过return 来实现 } 4.默认参数,带名参数和变长参数 默认参数 def getName(name:String = "JChubby") = {...} // 调用getName时如果没有传参数,则会使用默认的JChubby 带名参数: def showNum(x:Int,y:Int):Unit = {...} 调用该方法时,参数可以不按顺序,但是要执行参数名: showNum(y = 2,x = 4) 变长参数: def canChangeLength(x:Int*) = {...} canChangeLength(1,2,3,4,...) 5.lazy变量 当使用lazy关键字时,这个常/变量只有在使用的时候才会被分配内存 6.数组 Scala中分为两种: 定长数组:scala.collection.immutable.Array,一旦声明之后长度不可变变长数组:scala.collection.mutable.ArrayBuffer,动态数组
定长数组: val arr = new Array[Int](3)//声明长度为3,类型为Int的Array数组(new可省略) val arr1= Array[Int] (3) val arr2=Array(1,2,3) //或者声明时直接赋值,编译器会自动推断类型为Int //通过下标访问数组的方式为()而不是[],请注意! val a = arr(0) 7.变长数组的使用 val arrBuf=ArrayBuffer[Int]() arrBuf+=1 //添加元素 arrBuf+=(1,2,3) //一次性添加多个 arrBuf++=Array(1,2,3) //使用++=可以直接添加一个数组 arrBuf.insert(0,1,2,3) //在指定位置插入若干个元素,在0位置插入1,2,3 arrBuf insert(0,1,2,3) //Scala中的函数除了通过.来调用之外也可以直接写成这一形式,//之前的1 to 10 其实就是调用了1.to(10)这个to方法 arrBuf remove 0 //移除指定位置的元素 arrBuf remove (0,3) //移除指定位置后的连续n个元素arrBuf trimEnd 3 //删除末尾的n个元素
8. 和数组一样,Map同样也分为可变和不可变两种 不可变Map的使用: val myMap=Map("JC"->22,"Lo"->21) //声明一个Map,包含两个键值对,->表示键值对应的关系,不可变的Map中,一旦声明之后,该Map不可添加不可删除不可修改,只能查看,查看方式与可变Map一致 可变Map的使用: val myMutableMap=scala.collection.mutable.Map("JC"->22,"Lo"->21) myMutableMap+=("abc"->12,"bcd"->13) //添加元素 myMutableMap-="abc"//删除元素 myMutableMap("JC")=10//修改元素 myMutableMap+=("JC"->11)//修改元素 myMutableMap("JC")//查找元素 myMutableMap getOrElse("JC",-1)//查找元素 for((k,v)<- myMutableMap){//遍历,使用的是k,v格式来进行遍历 println(k+":"+v) } for((k,_)<- myMutableMap){//如果只要遍历k或者v,可以使用_占位符 println(k) } myMutableMap.keySet//获取所有的key myMutableMap.values//获取所有的value 9 元组其实就是一个集合,但是可以存放各种不同类型的数据 val group=(1,2,"JC",3.0) group._1 //通过下标访问元组的格式为:元组名._下标 或者 元组名 _下标。如: group _1 for(element <- group.productIterator){//遍历元组格式为,productIterator为固定格式不可少 ..... } 10 值函数 Scala中可以将函数赋值给一个变量,这个变量就称为值函数var resFunc=add _ //格式为方法名+空格+_
resFunc(1,2) //之后可以将这个变量当做方法来用
11 匿名函数: 顾名思义,没有名字的函数,定义格式如下: (参数名:参数类型,…) => 表达式 // 例如scala.collection.mutable.ArrayBuffer的map方法,其参数要求是一个匿名函数 arrBuf.map((x:Int)=>x+3) 12 函数柯里化 函数柯里化就是将原本有 很多参数 的函数,分成一个个只有 一个参数 的函数,每个函数的返回值都是 一个表达式 并且当做参数 传到下一个函数 柯里化是闭包的典型体现 13 高阶函数示例 数组的map函数 arr.map(1+_) //_表示数组中的每个元素,执行的结果为每个元素+1 数组的filter函数 arr.filter(_>2)//_ > 2会将数组中大于2的元素过滤出来 数组的reduce函数 arr.reduce(_+_)//reduce是迭代运算,将数组中两个元素先执行操作,把结果作为一个元素继续和下一个元素进行操作,执行结果为:1+2=3,3+3=9,也就是求和 14.list序列 val list=List(1,2,3) list.head//获取头元素 list.tail//获取除了头元素之外的其他元素 7::list//新增元素//注意,::运算符是从右向左的 list.take(2)//获取前n个元素 val list1=List(1,2,3) list.zip(list1) //得到的结果为List((1,a),(2,b),(3,c)),如果两个list的长度不同,以比较短的为基础 val list2=List(List(1,2),List(2,3),List(3,3)) list2.flatten //得到的结果为List(1,2,2,3,3,4),用于将嵌套List组合成一个新的List list2.flatMap(_.map(_*2))//跟flatten相比,flatmap在组合之前,会先对每个子List进行map操作 15.case class和模式匹配: case class又称为样例类,和普通的类相比,样例类不用new就可以实例化,默认执行的是apply方法来构造对象