1. 程式人生 > 實用技巧 >SpringBoot專案實現評論功能、分類頁面與標籤頁面

SpringBoot專案實現評論功能、分類頁面與標籤頁面

函數語言程式設計

面向物件程式設計

簡潔優雅安全

特性:可擴充套件性,面向物件,函數語言程式設計,Java和Scala無縫操作,靜態型別的語言

型別之間的關係

陣列的各種方法

建立方法一

1  var arr:Array[Int]=new Array[Int](10);

建立方法二

基本操作(運算元組arr)描述
arr.length 返回陣列的長度
arr.head 檢視陣列第一個元素
arr.tail 檢視陣列除了第一個元素剩下的元素
arr.isEmpty 判斷陣列是否為空
arr.last 檢視陣列最後一個元素
arr.init 除最後一個元素的其他元素
arr.contains(x) 判斷陣列是否包含元素x

ArrayBuffer

1 import scala.collection.mutable.ArrayBuffer
2 
3 //變長陣列ArrayBuffer
4 
5 var numArrayBuffer = new ArrayBuffer[ Int] ();

條件判斷

迴圈語句

for迴圈

1  for( var x <- Range
2     if condition1; if condition2...
3    ){statement(s);}

for巢狀迴圈

指定條件迴圈

for (enumerators) yield e

收集值

while迴圈

while(condition)
{
statement(s);
}

集合

list

用法

1  val list1=List(1,2,3,4)
2  val list2=1::2::3::4::Nil

比較
xs.startsWith(ys) 測試序列xs是否以序列ys開頭(存在多種形式)。
xs.endsWith(ys) 測試序列xs是否以序列ys結束(存在多種形式)。
xs.contains(x) 測試xs序列中是否存在一個與x相等的元素。
排序
xs.sorted
通過使用xs中元素型別的標準順序,將xs元素進行排序後得到的新序列。
加法:
x +: xs 由序列xs的前方新增x所得的新序列。
xs :+ x 由序列xs的後方追加x所得的新序列。
索引搜尋
xs.indexOf(x) 返回序列xs中等於x的第一個元素的索引
xs.lastIndexOf(x) 返回序列xs中等於x的最後一個元素的索引
xs.indexOfSlice(ys) 查詢子序列ys,返回xs中匹配的第一個索引
xs.lastIndexOfSlice(ys) 查詢子序列ys,返回xs中匹配的倒數一個索引

可變列表

ØListBuffer是可變的,因此可以使用可變序列的所有方法從中刪除元素

加法:
buf += x 將元素x追加到buffer,並將buf自身作為結果返回。
buf += (x, y, z) 將給定的元素追加到buffer。
buf ++= xs 將xs中的所有元素追加到buffer。
x +=: buf 將元素x新增到buffer的前方。
xs ++=: buf 將xs中的所有元素都新增到buffer的前方。
buf.insert (i, x) 將元素x插入到buffer中索引為i的位置。
buf.insertAll (i, xs) 將xs的所有元素都插入到buffer中索引為i的位置。

set集合

ØScala Set(集合)是沒有重複的物件集合,所有的元素都是唯一的。

ØScala 集合分為可變的和不可變的集合。

Ø預設情況下,Scala 使用的是不可變集合,如果想使用可變集合,需要引用 scala.collection.mutable.Set 包。

xs.contains(x)測試 x 是否是 xs 的元素。
xs(x) 與 xs contains x 相同。
xs.subsetOf(ys) 測試 xs 是否是 ys 的子集。
加法:
xs + x 包含 xs 中所有元素以及 x 的集合。
xs + (x, y, z) 包含 xs 中所有元素及附加元素的集合
移除:
xs - x 包含 xs 中除x以外的所有元素的集合。
xs.empty 與 xs 同類型的空集合。
二值操作:
xs.intersect(ys) 集合 xs 和 ys 的交集。
xs.union(ys) 集合 xs 和 ys 的並集。
xs.diff(ys) 集合 xs 和 ys 的差集。
map

ØMap(對映)是一種可迭代的鍵值對(key/value)結構。所有的值都可以通過鍵來獲取。

ØMap 有兩種型別,可變與不可變,區別在於可變物件可以修改,而不可變物件不可以。

Ø預設情況下 Scala 使用不可變 Map。如果需要使用可變集合,需要顯式的引入 import scala.collection.mutable.Map 類

1  val shop:Map[String:Double]=Map("conmputer"->3600,"Iphone"->2000,"cup"->1000)

查詢:
ms.get(k) 返回一個Option,其中包含和鍵k關聯的值。若k不存在,則返回None。
ms(k) (完整寫法是ms apply k)返回和鍵k關聯的值。若k不存在,則丟擲異常。
ms.getOrElse (k, d) 返回和鍵k關聯的值。若k不存在,則返回預設值d。
ms.contains(k) 檢查ms是否包含與鍵k相關聯的對映。
新增及更新:
ms + (k -> v) 返回一個同時包含ms中所有鍵值對及從k到v的鍵值對k -> v的新對映。
ms + (k -> v, l -> w) 返回一個同時包含ms中所有鍵值對及所有給定的鍵值對的新對映。
ms ++ kvs 返回一個同時包含ms中所有鍵值對及kvs中的所有鍵值對的新對映。
移除:
ms - k 返回一個包含ms中除鍵k以外的所有對映關係的對映。
ms – ks 返回一個濾除了ms中與ks中給出的鍵相關聯的對映關係的新對映。
子容器(**Subcollection)**
ms.keys 返回一個用於包含ms中所有鍵的iterable物件
ms.keySet 返回一個包含ms中所有的鍵的集合。
ms.keysIterator 返回一個用於遍歷ms中所有鍵的迭代器。
ms.values 返回一個包含ms中所有值的iterable物件。
ms.valuesIterator 返回一個用於遍歷ms中所有值的迭代器。

可變map方法

新增及更新
ms(k) = v (完整形式為ms.update(x, v))。向對映ms中新增一個以k為鍵、以v為值的對映關係,ms先前包含的以k為值的對映關係將被覆蓋。
ms += (k -> v) 向對映ms增加一個以k為鍵、以v為值的對映關係,並返回ms自身。
ms += (k -> v, l -> w) 向對映ms中增加給定的多個對映關係,並返回ms自身。
ms ++= kvs 向對映ms增加kvs中的所有對映關係,並返回ms自身。
ms.put (k, v) 向對映ms增加一個以k為鍵、以v為值的對映,並返回一個Option,其中可能包含此前與k相關聯的值。
ms getOrElseUpdate (k, d) 如果ms中存在鍵k,則返回鍵k的值。否則向ms中新增對映關係k -> v並返回d。
移除:
ms -= k 從對映ms中刪除以k為鍵的對映關係,並返回ms自身。
ms -= (k, l, m) 從對映ms中刪除與給定的各個鍵相關聯的對映關係,並返回ms自身。
ms –= ks 從對映ms中刪除與ks給定的各個鍵相關聯的對映關係,並返回ms自身。
ms.remove(k) 從ms中移除以k為鍵的對映關係,並返回一個Option,其可能包含之前與k相關聯的值。
ms.clear() 刪除ms中的所有對映關係

遍歷集合

for(k<- shop.keys){
} //shop是表名

Scala函式

1  def functionName([引數列表]):[return type] ={
2  function body
3  return [expr]
4  }
5 可以簡寫為
6 
7  def add(x:Int,y:Int)={
8     x+y
9  }

可變函式

命名引數

預設引數值

匿名函式

匿名函式即是在定義函式的時候不給出函式名。

匿名函式是使用箭頭“=>”定義的,箭頭的左邊是引數列表,箭頭右邊是表示式,表示式將產生函式的結果。

簡寫
val list01=List(1,2,3,4)
list01.filter((x:Int)=>x%2==0)
list01.filter((x)=>x%2==0)
list01.filter(x=>x%2==0)
list01.filter(_%2==0)

高階函式

集合中的高階函式

Ømap:是指通過一個函式重新計算列表中所有元素,並且返回一個相同數目元素的新列表

Øforeach:和map類似,但是foreach沒有返回值,foreach只是為了對引數進行作用。

Øfilter:過濾移除使得傳入的函式的返回值為false的元素

Øflatten:可以把巢狀的結構展開,或者說flatten可以把一個二維的列表展開成一個一維的列表。

ØflatMap:結合了map和flatten的功能,接收一個可以處理巢狀列表的函式,然後把返回結果連線起來。

ØgroupBy是對集合中的元素進行分組操作,結果得到的是一個Map。

Øreduce:對資料進行規約

1  val list01=List(1,2,3,4,5,6)
2  list01.map(x=>x+1)
3  list01.filter(x=>x%2==0)
4  list01.foreach(x=>print(x+1))
5  list01.groupBy(x=>x%2)
6

單詞計數

1  val list01=List("hello word","hello word")
2  list01.flatMap(x=>x.split(" ")).groupBy(x=>x).map(x=>(x._1,x._2.length))
3  //第一個是單詞,第二個是單片語成的列表;列表。length可以實現技術

遞迴-》尾遞迴

類的定義

 1   class test01(n:Int,d:Int){
 2     require(d!=0,"分母不能為0")//非常6,可以直接報錯
 3     val number=n
 4     val demo=d
 5     override def toString: String ={
 6       number+"/"+demo
 7     }
 8   }
 9  object Test {
10    def main(args: Array[String]): Unit = {
11      val rationali=new test01(1,2)
12    println(rationali.toString)
13    }
14  }

樣例類

可以直接比較內容,而不是比較地址

而且可以直接cope

資料讀取寫入

ØScala不提供任何特殊檔案寫入能力,所以進行檔案的寫操作使用的是Java的I/O類中的PrintWriter或FileWriter來實現。

寫入



import java.io.PrintWriter
 object Test03 {
   def main(args: Array[String]): Unit = {
     val mp=new PrintWriter("D:\\helloword.txt")
     mp.write("hello word")
     mp.close()
   }
 }
 import java.io.File
 import java.io.FileWriter
 import java.io.BufferedWriter
 object Test03 {
   def main(args: Array[String]): Unit = {
     val mp=new BufferedWriter(new FileWriter(new File("D:\\hellword.txt")))
     mp.write("hello word")
     mp.close()}}

讀取

 import scala.io.Source
 object Test03 {
   def main(args: Array[String]): Unit = {
    val source=Source.fromFile("D:\\hello word.txt")
     for (elem <- source.getLines()) {
       println(elem)
     }
   }
 }