大數據知識:快學Scala(一)Scala的函數、方法和數據結構
06-06
大數據知識:快學Scala(一)Scala的函數、方法和數據結構
簡介
上一章,我們已經學習了Scala語言的特點,它是運行在JVM上的一種多範式編程式語言,具有開發快,靈活等特點。如果對於基礎不好的同學可以看一下我的文章大數據知識:快學Scala(一)Scala基礎。這一章我們將會介紹Scala語言的函數和方法、以及在Scala語言中常用的數據結構。
方法和函數
Scala中的+ - * / %等操作符的作用與Java一樣,位操作符& | ^ >> <<也一樣。只是有
一點特別的:這些操作符實際上是方法。例如:
a + b
是如下方法調用的簡寫:
a.+(b)
a 方法b可以寫成a.方法(b)
方法
方法的返回值類型可以不寫,編譯器可以自動推斷出來,但是對於遞歸函數,必須指定返回類型
函數
方法和函數的區別
在函數式編程語言中,函數是「頭等公民」,它可以像任何其他數據類型一樣被傳遞和操作
案例:首先定義一個方法,再定義一個函數,然後將函數傳遞到方法裡面
[cpp] view plain copy
- package cn.edu.hust.scala
- object FuctionDemo {
- //定義方法,方法和函數是不一樣的,方法可以不指定返回類型,只有遞歸函數需要指定
- def calculate(x:Int,y:Int): Int=x+y
- def f1(x:Int,y:Int): Int={
- x*y
- }
- //定義函數
- val f=(x:Int) => { x+10 }
- //在方法裡面調用函數
- def f2(f:Int=>Int,x:Int):Int={
- f(x)
- }
- //定義一個函數,返回元祖,用(a,b)接受參數,具體實現如下
- val func:(Int,Double)=>(Double,Int)={
- (a,b)=>(b,a)
- }
- //定義一個沒有返回值的方法,主要使用unit
- def func2(x:Int,y:Int):Unit={
- println(x+y)
- }
- def main(args: Array[String]): Unit = {
- val x=10
- val y=20
- println(calculate(x,y))
- //定義函數
- val z=(x:Int,y:Int) => { x+y }
- val t=(x:String,y:String) => {x+y}
- //方法裡面調用函數
- println(f2(f,10))
- //函數的使用
- println(z(100,200))
- val arr=Array(1,2,3,4,5)
- val arr1=arr.map(f)
- println(arr1.toBuffer)
- //原始對象沒有變化
- println(arr.toBuffer)
- // 調用函數
- println(func(2,3.0))
- //將方法轉化為函數,原來的方法不變
- val b=func2 _
- b(10,20)
- }
- }
Scala語言中的數據結構
Scala中的數組
[cpp] view plain copy
- package cn.edu.hust.scala
- import scala.collection.mutable.ArrayBuffer
- object ArrayDemo {
- def main(args: Array[String]): Unit = {
- //聲明一個array,需要指定類型和長度,默認值是0
- val arr=new Array[Int](8)
- println(arr.toBuffer)
- //也可以使用如下的操作聲明
- val arr2=Array(1,2,3,4,5)
- //取出下標為1的元素
- println(arr2(1))
- //可以使用一下方式,這裡定義了一個長度為1的array,初始值為10
- val arr3=Array[Int](10)
- println(arr3.toBuffer)
- //定義一個可變長度的數組
- val a=new ArrayBuffer[Int]()
- a+=1
- a++=Array(9,8,7,6)
- println(a)
- //在特定的下標中插入值
- a.insert(0,-1,-2)
- println(a)
- //移除下標2
- a.remove(2,1)
- println(a)
- //使用下標取值
- println(a(2))
- }
- }
Scala中的
[cpp] view plain copy
- package cn.edu.hust.scala
- import scala.collection.mutable.ListBuffer
- object ListDemo {
- def main(args: Array[String]): Unit = {
- //不可變的數組
- val list1=List(1,2,3,4,5)
- val list2=List(7,8,9)
- // 取值
- println(list1(1))
- //添加新的元數,添加到前段
- val list3=list1.+:(0)
- println(list3)
- //添加到後段
- val list4=list1.:+(3)
- println(list4)
- val list5=list1++list2
- //三個一組
- val lst=list5.grouped(3)
- println(lst.toList)
- //將lst壓平
- val t=lst.toList
- println(t.flatten)
- println(list5)
- val list6=list1:::list2
- println(list6)
- println("listbuffer")
- val lb=new ListBuffer[Int]
- //添加元素
- lb+=2
- //批量添加元素
- lb+=(3,4,5)
- //使用方法添加元素
- lb.append(-1,0)
- println(lb)
- val lb2=ListBuffer("a","b","c")
- //添加成為新的list
- val lb3=lb2++lb
- println(lb3)
- //添加list到lb3中
- lb3++=lb2
- println(lb3)
- }
- }
[cpp] view plain copy
- package cn.edu.hust.scala
- import scala.collection.mutable.Map
- object MapDemo {
- def main(args: Array[String]): Unit = {
- //創建一個map
- val m1=Map("a"->1,"b"->2,"c"->3)
- println(m1)
- //修改map的值
- m1("a")=10
- println(m1)
- //添加一些kv
- m1+="d"->8
- println(m1)
- //添加一些元組
- m1+=(("e",9),("h",10))
- println(m1)
- //查詢元素如果不包含的處理,如果沒有就默認設置0
- val z=m1.getOrElse("z",0)
- print(z)
- }
- }
- package cn.edu.hust.scala
- import scala.collection.mutable
- object SetDemo {
- def main(args: Array[String]): Unit = {
- val s=new mutable.HashSet[Int]
- //添加元素
- s+=1;
- //批量添加元素
- s+=(2,3,4,5,6)
- println(s)
- //改變set
- s++=mutable.HashSet(0,-1)
- println(s)
- //移除元素
- s.remove(3)
- println(s)
- //按照元素
- s.remove(2)
- println(s)
- }
- }
- package cn.edu.hust.scala
- object TupleDemo {
- def main(args: Array[String]): Unit = {
- //元組的聲明與初始化
- val t=(1,"spark",2.0)
- println(t)
- //元祖的取值,元祖的下標是從1開始的
- println(t._1)
- //對偶元組
- val t1=Array(("1",1),("a",2),("c",4))
- //將元組轉化成map
- println(t1.toMap)
- val t2=Array("a","2",10)
- val t3=Array(1,"spark",2.0);
- //拉鏈操作
- println(t2.zip(t3).toBuffer)
- //
- val t4=Array(2,5,"t",10)
- //如果元素個數對稱那麼將會捨棄多餘的
- println(t2.zip(t4).toBuffer)
- }
- }
- package cn.edu.hust.scala
- object Test {
- def main(args: Array[String]): Unit = {
- val list=List("hello word li hao","ming hao wo ai ni ai hello word")
- //將文本拿出後按照空格分離然後壓平
- val words=list.map(_.split(" ")).toBuffer.flatten
- println(words)
- // 將每一個單詞統計為1映射成為map
- val t=words.map((_,1))
- println(t)
- //按照元組分組
- val x=t.groupBy(_._1)
- // 取出key
- val key=x.map(_._1)
- //取出value
- val value=x.map(_._2.size)
- //拉鏈操作
- val result=key.zip(value)
- println(result)
- //排序
- var a=result
- println(a)
- }
- }
推薦閱讀:
※征服Scala 1
※模式匹配是語法糖嗎?
※Scala基礎語法參考
※Dotty 0.8.0-RC1 發布
※有哪些值得推薦的 Scala/Spark 編程 IDE?