Scala(持續更新中...)

来源:https://www.cnblogs.com/ggyt/archive/2023/07/14/17554773.html
-Advertisement-
Play Games

# Scala基礎篇 ## 數據類型 下表中列出的數據類型都是對象,可以直接對它們調用方法。 | 數據類型 | 描述 | | | | | Byte | 8位有符號補碼整數。數值區間為 -128 到 127 | | Short | 16位有符號補碼整數。數值區間為 -32768 到 32767 | | ...


Scala基礎篇

數據類型

下表中列出的數據類型都是對象,可以直接對它們調用方法。

數據類型 描述
Byte 8位有符號補碼整數。數值區間為 -128 到 127
Short 16位有符號補碼整數。數值區間為 -32768 到 32767
Int 32位有符號補碼整數。數值區間為 -2147483648 到 2147483647
Long 64位有符號補碼整數。數值區間為 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754 標準的單精度浮點數
Double 64 位 IEEE 754 標準的雙精度浮點數
Char 16位無符號Unicode字元, 區間值為 U+0000 到 U+FFFF
String 字元序列
Boolean true或false
Unit 表示無值,和其他語言中void等同。用作不返回任何結果的方法的結果類型。Unit只有一個實例值,寫成()。
Null null 或空引用
Nothing Nothing類型在Scala的類層級的最底端;它是任何其他類型的子類型。
Any Any是所有其他類的超類
AnyRef AnyRef類是Scala里所有引用類(reference class)的基類

表示Long類型,在數字後面添加L或者l作為尾碼;浮點數後面有f或者F尾碼時,表示Float類型,否則就是Double

變數

用關鍵詞“var”聲明變數,關鍵詞"val"聲明常量。

var myName : String = "gyt"
val myAge : Int = 21 

scala中不一定要指明數據類型,其數據類型通過變數或常量的初始值推斷出來的,因此,在沒有指明數據類型的情況下,必須要給出初始值。

訪問修飾符

private關鍵詞修飾,只能被當前類以及當前類的內部類訪問到,外層類訪問不到。

class Outer{
    class Inner{
        private def f(){
            println("f")
        }
        class InnerMost{
            f() // 正確
        }
    }
    (new Inner).f() //錯誤
}

protected關鍵詞修飾,只能被當前類的子類訪問。

package p {
    class Super {
        protected def f() {println("f")}
    }
    class Sub extends Super {
        f()
    }
    class Other {
        (new Super).f() //錯誤
    }
}

沒有指定任何修飾符,預設為public,在任何地方都可以被訪問。

條件和迴圈

以下是IF...ELSE語句實例。

object Test {
   def main(args: Array[String]) {
      var x = 30;

      if( x == 10 ){
         println("X 的值為 10");
      }else if( x == 20 ){
         println("X 的值為 20");
      }else if( x == 30 ){
         println("X 的值為 30");
      }else{
         println("無法判斷 X 的值");
      }
   }
}

以下是一個使用了 i to j 語法(包含 j)的實例,箭頭 <- 用於為變數 a 賦值。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      // for 迴圈
      for( a <- 1 to 10){
         println( "Value of a: " + a );
      }
   }
}

for 迴圈 中你可以使用分號;來設置多個區間,它將迭代給定區間所有的可能值。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      var b = 0;
      // for 迴圈
      for( a <- 1 to 3; b <- 1 to 3){
         println( "Value of a: " + a );
         println( "Value of b: " + b );
      }
   }
}

for 迴圈集合的語法如下。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      val numList = List(1,2,3,4,5,6);

      // for 迴圈
      for( a <- numList ){
         println( "Value of a: " + a );
      }
   }
}

你可以將 for 迴圈的返回值作為一個變數存儲。

object Test {
   def main(args: Array[String]) {
      var a = 0;
      val numList = List(1,2,3,4,5,6,7,8,9,10);

      // for 迴圈
      var retVal = for{ a <- numList 
                        if a != 3; if a < 8
                      }yield a

      // 輸出返回值
      for( a <- retVal){
         println( "Value of a: " + a );
      }
   }
}

函數式編程(重點)

函數式編程:對於相同的輸入永遠會得到相同的輸出,而且沒有任何可以觀察的副作用,也不依賴外部的環境狀態。參考什麼是函數式編程?

Scala中函數是為完成某一功能的程式語句的集合,類中定義的函數稱之為方法。下麵是方法的一個實例。

object add{
   def addInt( a:Int, b:Int ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

可變參數:我們不需要指定函數參數的個數,可以向函數傳入可變長度參數列表。通過在參數的類型之後放一個星號來設置可變參數(可重覆的參數)。

object Test {
   def main(args: Array[String]) {
        printStrings("Runoob", "Scala", "Python");
   }
   def printStrings( args:String* ) = {
      var i : Int = 0;
      for( arg <- args ){
         println("Arg value[" + i + "] = " + arg );
         i = i + 1;
      }
   }
}

預設參數: scala可以為函數參數指定預設參數值,使用了預設參數,你在調用函數的過程中可以不需要傳遞參數,這時函數就會調用它的預設參數值,如果傳遞了參數,則傳遞值會取代預設值。

object Test {
   def main(args: Array[String]) {
        println( "返回值 : " + addInt() );
   }
   def addInt( a:Int=5, b:Int=7 ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

匿名函數:箭頭左邊是參數列表,右邊是函數體。

var inc = (x: Int) => {x+1}
var x = inc(7) - 1

//定義一個函數,以函數作為參數輸入
def f(func: String => Unit): Unit = {
    func("gyt")
}
var fun = (name: String) => {println(name)}
f(fun)

傳名調用:傳遞的不是具體的值,而是代碼塊。和一般的傳值調用相比,每次使用傳名調用時,解釋器都會計算一次表達式的值。

def f1(): Int = {
    println("f1被調用")
    12
}
def f2(a: => Int): Unit = {
    println(a)
    println(a)
}
f2(f1())

至簡原則

(1)函數中的return可以省略,以最後一行代碼作為代碼塊的返回值。

def f1(name: String): String = {
    name
}

(2)如果函數體只有一行代碼,可以省略花括弧。

def f2(name: String): String = name

(3)如果編譯器可以推斷出來返回值,那麼可以省略(:和返回值類型一起省略)。有意思的是,到這一步,scala函數的形式形如數學中的f(x) = y。

def f3(name: String) = name

(4)如果有return,則(3)不適用。

(5)如果返回值是Unit,可以省略等號和返回值,但是此時花括弧不能省略。

def f4(name: String) {
    println(name)
}

(6)如果函數沒有參數,那麼調用它的時候可以直接用函數名。不用加“()”。

閉包:如果一個函數,訪問到它的外部(局部)變數的值,那麼這個函數和它所處的環境,稱為閉包。

柯里化:將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。新的函數返回一個以原有第二個參數為參數的函數。

object Test {
   def main(args: Array[String]) {
      val str1:String = "Hello, "
      val str2:String = "Scala!"
      println( "str1 + str2 = " +  strcat(str1)(str2) )
   }

   def strcat(s1: String)(s2: String) = {
      s1 + s2
   }
}

字元串

在 Scala 中,字元串的類型實際上是 Java String,它本身沒有 String 類。

序號 方法及描述
1 char charAt(int index)返回指定位置的字元
2 int compareTo(Object o)比較字元串與對象
3 int compareTo(String anotherString)按字典順序比較兩個字元串
4 int compareToIgnoreCase(String str)按字典順序比較兩個字元串,不考慮大小寫
5 String concat(String str)將指定字元串連接到此字元串的結尾
6 boolean contentEquals(StringBuffer sb)將此字元串與指定的 StringBuffer 比較。
7 static String copyValueOf(char[] data)返回指定數組中表示該字元序列的 String
8 static String copyValueOf(char[] data, int offset, int count)返回指定數組中表示該字元序列的 String
9 boolean endsWith(String suffix)測試此字元串是否以指定的尾碼結束
10 boolean equals(Object anObject)將此字元串與指定的對象比較
11 boolean equalsIgnoreCase(String anotherString)將此 String 與另一個 String 比較,不考慮大小寫
12 byte getBytes()使用平臺的預設字元集將此 String 編碼為 byte 序列,並將結果存儲到一個新的 byte 數組中
13 byte[] getBytes(String charsetName使用指定的字元集將此 String 編碼為 byte 序列,並將結果存儲到一個新的 byte 數組中
14 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)將字元從此字元串複製到目標字元數組
15 int hashCode()返回此字元串的哈希碼
16 int indexOf(int ch)返回指定字元在此字元串中第一次出現處的索引
17 int indexOf(int ch, int fromIndex)返回在此字元串中第一次出現指定字元處的索引,從指定的索引開始搜索
18 int indexOf(String str)返回指定子字元串在此字元串中第一次出現處的索引
19 int indexOf(String str, int fromIndex)返回指定子字元串在此字元串中第一次出現處的索引,從指定的索引開始
20 String intern()返回字元串對象的規範化表示形式
21 int lastIndexOf(int ch)返回指定字元在此字元串中最後一次出現處的索引
22 int lastIndexOf(int ch, int fromIndex)返回指定字元在此字元串中最後一次出現處的索引,從指定的索引處開始進行反向搜索
23 int lastIndexOf(String str)返回指定子字元串在此字元串中最右邊出現處的索引
24 int lastIndexOf(String str, int fromIndex)返回指定子字元串在此字元串中最後一次出現處的索引,從指定的索引開始反向搜索
25 int length()返回此字元串的長度
26 boolean matches(String regex)告知此字元串是否匹配給定的正則表達式
27 boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)測試兩個字元串區域是否相等
28 boolean regionMatches(int toffset, String other, int ooffset, int len)測試兩個字元串區域是否相等
29 String replace(char oldChar, char newChar)返回一個新的字元串,它是通過用 newChar 替換此字元串中出現的所有 oldChar 得到的
30 String replaceAll(String regex, String replacement使用給定的 replacement 替換此字元串所有匹配給定的正則表達式的子字元串
31 String replaceFirst(String regex, String replacement)使用給定的 replacement 替換此字元串匹配給定的正則表達式的第一個子字元串
32 String[] split(String regex)根據給定正則表達式的匹配拆分此字元串
33 String[] split(String regex, int limit)根據匹配給定的正則表達式來拆分此字元串
34 boolean startsWith(String prefix)測試此字元串是否以指定的首碼開始
35 boolean startsWith(String prefix, int toffset)測試此字元串從指定索引開始的子字元串是否以指定首碼開始。
36 CharSequence subSequence(int beginIndex, int endIndex)返回一個新的字元序列,它是此序列的一個子序列
37 String substring(int beginIndex)返回一個新的字元串,它是此字元串的一個子字元串
38 String substring(int beginIndex, int endIndex)返回一個新字元串,它是此字元串的一個子字元串
39 char[] toCharArray()將此字元串轉換為一個新的字元數組
40 String toLowerCase()使用預設語言環境的規則將此 String 中的所有字元都轉換為小寫
41 String toLowerCase(Locale locale)使用給定 Locale 的規則將此 String 中的所有字元都轉換為小寫
42 String toString()返回此對象本身(它已經是一個字元串!)
43 String toUpperCase()使用預設語言環境的規則將此 String 中的所有字元都轉換為大寫
44 String toUpperCase(Locale locale)使用給定 Locale 的規則將此 String 中的所有字元都轉換為大寫
45 String trim()刪除指定字元串的首尾空白符
46 static String valueOf(primitive data type x)返回指定類型參數的字元串表示形式

數組

Scala 語言中提供的數組是用來存儲固定大小的同類型元素。下麵是聲明數組的三種方式。

var z:Array[String] = new Array[String](3)
var zz = new Array[String](3)
var zzz = Array("Runoob", "Baidu", "Google")

模式匹配

一個模式匹配包含了一系列備選項,每個都開始於關鍵字 case。每個備選項都包含了一個模式及一到多個表達式。箭頭符號 => 隔開了模式和表達式。

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

實例中第一個 case 對應整型數值 1,第二個 case 對應字元串值 two,第三個 case 對應類型模式,用於判斷傳入的值是否為整型,相比使用isInstanceOf來判斷類型,使用模式匹配更好。第四個 case 表示預設的全匹配備選項,即沒有找到其他匹配時的匹配項,類似 switch 中的 default。

object Test {
   def main(args: Array[String]) {
        val alice = new Person("Alice", 25)
        val bob = new Person("Bob", 32)
        val charlie = new Person("Charlie", 32)
   
    for (person <- List(alice, bob, charlie)) {
        person match {
            case Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   // 樣例類
   case class Person(name: String, age: Int)
}

使用了case關鍵字的類定義就是樣例類(case classes),樣例類是種特殊的類,經過優化以用於模式匹配。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # java操作zookeeper 1. 創建一個maven項目在pom文件里引入如下依賴: ~~~XML junit junit 4.10 test org.apache.curator curator-framework 4.0.0 org.apache.curator curator-reci ...
  • # 尾碼數組是什麼 尾碼數組就是主要處理字元串尾碼問題的,它的實現演算法主要有兩種:倍增法和 DC3,複雜度分別是 $O(n\log n)$ 和 $O(n)$。這裡由於 DC3 代碼答辯且難以理解,我就只寫了倍增法的實現。 # 例題引入 [P3809 【模板】尾碼排序](https://www.luo ...
  • > 出於各種限制,很多公司依然停留在Java8,部分小伙伴轉向了Kotlin。Kotlin作為靜態編譯語言,提供大量語法糖,而且編譯後的位元組碼跟Java一致。 > > 當時,Java8於2014年發佈,Kotlin於2016年,很多宣稱的語法糖都是對比的Java8。不禁要問,相對今天的Java17, ...
  • """ # 一、axios是什麼 Axios 是一個基於 promise 網路請求庫,作用於node.js 和瀏覽器中。 它是 isomorphic 的(即同一套代碼可以運行在瀏覽器和node.js中)。在服務端它使用原生 node.js http 模塊, 而在客戶端 (瀏覽端) 則使用 XMLHt ...
  • 中大型項目中,我們都會把項目結構劃分多個模塊。它清晰的定義,便於項目結果維護,同時在日常代碼變更時,各個模塊的隔離也一定程度上保證了變更質量…… ...
  • python的開發工具有很多款,很多都是非常好用的,其中vscode作為其中一款Python的開發工具,是非常輕量級的,今天我們來介紹一下vs code的下載與安裝。 # vscode的下載與安裝 首先需要到vscode的官網,這個谷歌或者百度一下就可以搜到,然後根據你的系統下載你對應的版本,我這裡 ...
  • 第三方鏡像是在Docker Hub或其他容器註冊表上提供的預構建Docker容器鏡像。這些鏡像由個人或組織創建和維護,可以作為您容器化應用程式的起點。 ### 查找第三方鏡像 [**Docker Hub**](https://hub.docker.com/) 是最大和最受歡迎的容器鏡像註冊表,包含官 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《Java擴展Nginx》系列的第 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...