Scala 的學習

来源:https://www.cnblogs.com/dream-come-true/archive/2023/05/10/17389339.html
-Advertisement-
Play Games

Scala 只是學習無基本理論 安裝Scala 裝前必須有jdk windows安裝 解壓縮 D:dev/scala 配置環境變數 SCALA_HONE path cmd檢查 Scala -version 直接輸入Scala 控制台運行 idea安裝與運行Scala idea-->插件-->scal ...


Scala

只是學習無基本理論

安裝Scala

裝前必須有jdk

windows安裝

解壓縮 D:dev/scala

配置環境變數

SCALA_HONE

path

cmd檢查

Scala -version

直接輸入Scala 控制台運行

idea安裝與運行Scala

idea-->插件-->scala-->安裝-->重啟

新建maven項目

catalog-->maven

archetype-->

image

項目結構-->全局庫-->添加Scala

image

image

添加應用支持-->scala
add開頭
image

image

新建Scala類 選擇 object

image

scala 完全面向對象

scala風格與java風格

public class JavaDemo01 {
    public static void main(String[] args) {
        System.out.println("我愛你中國");
    }
}
javac JavaDemo01
object ScalaDemo01{
    def main(args: Array[String]): Unit = {
    print("我愛你中國")
  }
}
scalac ScalaDemo01

終端運行Scala

編碼 utf-8

scalac 文件名字--> 生成 文件名字$.class 與 文件名字.class-->調用 文件名字.class

Scala項目啟動方式

main函數與extends app特質的區別:

App是scala語言內置的一個特質,使用它,則把對應object內部的整體作為scala main的一部分,有延遲啟動的特性。

同時,命令行參數args也作為App特質的一部分,可以被開發者直接使用。而main函數則是scala的預設啟動方式。

使用main函數

object ScalaDemo02{
    def main(args: Array[String]): Unit = {
    print("我愛你中國")
  }
}

使用App特質

object ScalaDemo03 extends App{
    print("我愛你中國")
}
object ScalaDemo04 extends App{
    print(args(0))
}

終端運行:

scalac ScalaDemo04.scala
scala ScalaDemo04 lhz

Scala代碼與Java代碼混用

object ScalaDemo05{
    def main(args: Array[String]): Unit = {
    System.out.println("我愛你中國")
  }
}

在 Scala 代碼中 可以直接使用 Java 代碼

註意:main 方法使用Scala 風格

變數與常量

object ScalaDemo06{
    def main(args: Array[String]): Unit = {
    // var 變數 修飾符
        var a:Int = 10
    // val 常量 修飾符
    	val b:Int = 10
        
        a = 20
        println(a)
        /**
         *報錯
         *reassignment to val
        */
        // b = 20
  }
}

字元串基本使用

object ScalaDemo07{
    def main(args: Array[String]): Unit = {
        var str01:String = "我愛你"
        var str02:String = "中國"
        // java 風格
        println (str01 + str02)
        // 插值方式 與 python 風格比較相像
        var slogan:String = "桃李不言下自成蹊"
        println(s"slogan >>> $slogan")
        
        println("""
        	|我愛你中國
        	|親愛的母親
        """.strpMargin)
  }
}

選擇結構

object ScalaDemo08{
    def main(args: Array[String]): Unit = {
        var weekDay:Int = 1
        if (weekDay == 1){
            println("周一")
        }else if (weekDay == 2){
            println("周二")
        }else if (weekDay == 3){
            println("周三")
        }else if (weekDay == 4){
            println("周四")
        }else if (weekDay == 5){
            println("周五")
        }else if (weekDay == 6){
            println("周六")
        }else{
            println("周日")
  	}
  }
}

迴圈結構

object ScalaDemo09{
    def main(args: Array[String]): Unit = {
        var count:Int = 0
        while(count<5){
            println(count)
            count += 1
        }
  }
}
object ScalaDemo10{
    def main(args: Array[String]): Unit = {
        //Range 1 to 5
        println(1 to 5)
        println(1.to(5))
        println(1 until 5)
        println(1.until(5))
        
        // <- 賦值
        for (i <- 0 until 5){
            println(i)
        }
        println("--------------------^_ ~ _^----------------------")
        // 求偶數值
        for (i <- 0 until 10){
            if (i % 2 == 0){
                println(i)
            }
        }
        println("--------------^_ ~ _^----------------")
        for (i <- 0 until 10 if i % 2 == 0){
            println(i)
        }
        println("--------------^_ ~ _^----------------")
        for (i <- 0 until 10 by(2)){
            println(i)
        }
        println("--------------------^_ ~ _^----------------------")
        // 增強for迴圈
        var courses = Array("Hadoop","Hive","Sqoop","Flume","Hbase","Phoenix","Presto")
        for (course <- courses){
            println(course)
        }
  }
}

函數

無參數 無返回值

object ScalaDemo01{
    def main(args: Array[String]): Unit = {
    	sayHi()
  }
    // def 函數定義關鍵字 
    // sayHI 函數名稱
    // () 函數參數
    // :後面的數據類型為返回值數據類型
    // : Unit 無返回值的數據類型占位符
    // {} 方法體
    private def sayHi(): Unit = {
      println("無參數 無返回值 函數 sayHi")  
    }
}

有參數 無返回值

object ScalaDemo02{
    def main(args: Array[String]): Unit = {
   	 sayHi(msg = "hello word")
  }
    private def sayHi(msg:String): Unit = {
        println("有參數 無返回值 函數 sayHi")
        println(s"參數是 >>> ${msg}")
    }
}

預設參數 無返回值

object ScalaDemo03{
    def main(args: Array[String]): Unit = {
    	sayHi()
        sayHi(msg = "hello")
  }
    private def sayHi(msg:String = "hi"): Unit = {
        println("預設參數 無返回值 函數 sayHi")
        println(s"參數是 >>> ${msg}")
    }
}
# 輸出結果:
預設參數 無返回值 函數 sayHi
參數是 >>> hi
預設參數 無返回值 函數 sayHi
參數是 >>> hello

有參數 有返回值

object ScalaDemo04{
    def main(args: Array[String]): Unit = {
    	println(sum(10,20))
  }
    def sum(a:Int , b:Int): Int ={
        // 函數的最後一行為返回值
        a+b
    }
}

可變參數 無返回值

public class JavaDemo04{
     public static void main(String[] args) {

    }
    private static String
}
object ScalaDemo05{
    def main(args: Array[String]): Unit = {
    	println(format())
        println(format(numbers = 1))
        println(format(numbers = 1,2))
  }
    def format(numbers: Int*): String = {
        // var result:String = null
        var result:Int = 0
    	if(numbers.size > 0){
            for(number <- numbers){
                result += number
            }
        }
        result
    }
}

面向對象

類與對象

object ScalaDemo01{
    def main(args: Array[String]): Unit = {
   		val person = new Person01
        person.name = "lhz"
        println(person.name)
  }
    class Person01{
        // _ 代表著 占位符 占位
        var name:String = _
    }
}

封裝

scala中屬性、方法預設為public

private只在類的內部和伴生對象中可用

protected,同類、子類可以訪問,同包無法訪問

private[包名],增加包訪問許可權,包名下的其他類也可以使用

Scala提供進一步的封裝,“public”屬性底層實際上都是private,訪問時本質上是調用了xxx(get) 和 xxx_eq$(set) 方法,

但這裡的方法名並不是getXXX和setXXX,由於一些Java框架會利用反射調用getXXX和setXXX,

因此Scala也提供了上面提到過的@BeanProperty註解去生成某屬性的這兩個方法,

但註意@BeanProperty不能加在private修飾的屬性上,

可以理解為由於“public”本身就是private,將變數修飾為private然後再提供getter、setter方法比較冗餘,Scala不推薦這樣做。

// 假 封裝
object ScalaDemo02{
    def main(args: Array[String]): Unit = {
   		val person = new Person02
        person.setName("lhz")
        println(person.getName)
        person.name = "lz"
        println(person.name)
  }
    class Person02{
        // _ 代表著 占位符 占位
        @BeanProperty
        var name:String = _
    }
}
// private 不推薦
// 手寫 set get 方法
object ScalaDemo03 {
  def main(args: Array[String]): Unit = {
   val person = new Person03
   person.setName("lhz")
   println(person.getName)
  }
  class Person03{
    private var name: String = _

    def getName: String = {
      this.name
    }

    def setName(name: String): Unit ={
      this.name = name
    }
  }
}

java代碼混用

public class Person04 {
    private String realName;

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }
}
object ScalaDemo04 {
  def main(args: Array[String]): Unit = {
    val person = new Person04
    person.setRealName("李昊哲")
    println(person.getRealName)
  }
}

構造函數

object ScalaDemo05{
    def main(args: Array[String]): Unit = {
   		val person01 = new Person05("person01","220422198311222011")
    val person02 = new Person05("person02","220422198311222011",15311484567L)
    val person03 = new Person05("person02","220422198311222011","我愛你中國")
    val person04 = new Person05("person02","220422198311222011",15311484568L,"我愛你中國")
    println(person01)
    println(person02)
    println(person03)
    println(person04)
  }
}
    //主構造函數
class Person05(val realName:String, val idCard:String){
	println("Person05 主構造器 執行了")
    var mobile: Long= _
    var slogan: String= _
        
    // 輔助構函數 輔助構函數不能有類型註解
    def this(realName: String , idCard: String, mobile: Long)={
            // 輔助構函數 的 第一行代碼必須調用 主構造函數 或者其他 輔助構函數
            this(realName,idCard)
            this.mobile = mobile
        }
        def this(realName: String , idCard: String, Slogan: String)={
            // 輔助構函數 的 第一行代碼必須調用 主構造函數 或者其他 輔助構函數
            this(realName,idCard)
            this.slogan = slogan
        }
        def this(realName: String , idCard: String, mobile: Long, slogan: String)={
            // 輔助構函數 的 第一行代碼必須調用 主構造函數 或者其他 輔助構函數
            this(realName,idCard,mobile)
            this.slogan = slogan
        }
    override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", idCard:"+ idCard +
      ", mobile:" + mobile +
      ", slogan:"  + slogan

}

運行結果

Person05 主構造器 執行了
Person05 主構造器 執行了
Person05 主構造器 執行了
Person05 主構造器 執行了
Person05, realName:person01, idCard:220422198311222011, mobile:0, slogan:null
Person05, realName:person02, idCard:220422198311222011, mobile:15311484567, slogan:null
Person05, realName:person02, idCard:220422198311222011, mobile:0, slogan:我愛你中國
Person05, realName:person02, idCard:220422198311222011, mobile:15311484568, slogan:我愛你中國

繼承

object ScalaDemo06 {
  def main(args: Array[String]): Unit = {
    val worker = new Worker("李昊哲", "15311484568", "架構師")
    println(worker)
  }
}

// 主構造函數
class Person06(val realName: String, val mobile: String) {

  println("Person06 主構造器 執行了")

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile
}

class Worker(realName: String, mobile: String, job: String) extends Person06(realName, mobile) {
  println("Worker 主構造器 執行了")

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile +
      ", job:" + job
}

抽象類

object ScalaDemo07 {
  def main(args: Array[String]): Unit = {
    val teacher = new Teacher
    teacher.realName = "李昊哲"
    teacher.mobile = "15311484568"
    println(teacher)
    teacher.hi()
  }
}

abstract class Person07() {

  println("Person07 主構造器 執行了")

  var realName: String
  var mobile: String

  def hi(): Unit

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile
}

class Teacher extends Person07 {
  println("Teacher 主構造器 執行了")

  override def toString: String =
    this.getClass.getSimpleName +
      ", realName:" + realName +
      ", mobile:" + mobile

  override var realName: String = _
  override var mobile: String = _

  override def hi(): Unit = {
    println("接著奏樂 接著舞")
  }
}

伴生類與伴生對象

scala中的類不能定義靜態成員,而代之以定義單例對象來替代
單例對象通過object關鍵字來聲明
單例對象中的所有方法,可以直接通過object單例對象的名字直接來調用。
一個單例對象可以綁定在一個類,當單例對象和某個類寫在同一個源文件且共用一個名字,它們就產生了綁定關係。
此時單例對象稱之為該類的伴生對象,類稱之為該對象的伴生類。

類和它的伴生對象可以互相訪問其私有成員
單例對象不能new,所以也沒有構造參數
可以把單例對象當做java中可能會用到的靜態方法工具類。
作為程式入口的方法必須是靜態的,所以main方法必須處在一個單例對象中,而不能寫在一個類中。

object ScalaDemo08 {
  def main(args: Array[String]): Unit = {
    Food.printMsg()
    new Food().printSlogan()
  }
}

class Food {
  private val msg: String = "hello"
  def printSlogan(): Unit = {
    println(Food.slogan)
  }
}

object Food {
  private val slogan: String = "桃李不言下自成蹊"
  def printMsg(): Unit = {
    println(new Food().msg)
  }
}

apply

object ScalaDemo09 {
  def main(args: Array[String]): Unit = {
    // Drink() 相當於 Drink.apply
    Drink()
    new Drink().apply()
  }
}

class Drink{
  def apply(): Unit = {
    println("class Food 執行...")
  }
}

object Drink {
  def apply(): Unit = {
    println("object Food 執行...")
  }
}

本文來自博客園,作者:JD_L,轉載請註明原文鏈接:https://www.cnblogs.com/dream-come-true/p/17389339.html


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

-Advertisement-
Play Games
更多相關文章
  • 字元串駐留池(string intern pool)是指,對於某些編程語言,相同的字元串字面值(即具有相同文本內容的字元串)在程式運行時只會被在記憶體中存儲一份,即只保存一個字元串實例。這樣做可以減少記憶體占用,並提高程式執行的效率。 在 Java 中,字元串駐留池是一個存儲字元串的緩存,它存儲在運行時 ...
  • 1、創建WEBAPI 1 using Dapper; 2 using MesErp.Models; 3 using Microsoft.AspNetCore.Mvc; 4 using Microsoft.Extensions.Configuration; 5 using Newtonsoft.Jso ...
  • C#是一種強類型語言,可以捕獲和處理各種異常,從而幫助我們發現程式中出現的錯誤。在程式開發過程中,如果需要找到特定的錯誤情況並處理,這時就需要創建自定義異常。本文將介紹如何在C#中創建和使用自定義異常。 1、什麼是異常? 異常是指在程式執行期間發生的錯誤或異常情況,例如除法中除以0、文件不存在、記憶體 ...
  • 一:背景 1. 講故事 最近在分析一個 linux 上的 dump,最後的誘因是大量的lock鎖誘發的高頻上下文切換,雖然問題告一段落,但我還想知道一點信息,所謂的高頻到底有多高頻?鎖競爭到底是一個怎樣的鎖競爭? 如果瞭解這些信息對我們後續分析此類問題非常有幫助。 要想獲取此類信息,看 dump 肯 ...
  • 本文屬於OData系列文章 Intro 前面寫了很多有關OData使用的文章,很多讀者會有疑問,直接將實體對象暴露給最終用戶會不會有風險?$expand在預設配置的情況下,數據會不會有泄露風險? 答案是肯定的,由於OData的特性,提供給我們便捷同時也會帶來一些風險。很多地方推薦使用DTO模式來隔離 ...
  • 一、安裝 Mailx Ubuntu sudo apt-get install bsd-mailx CentOS7 yum -y install mailx 二、獲取郵箱授權碼 (解決報錯問題 535 Error: authentication failed, system busy) 以騰訊企業郵箱 ...
  • 在Linux平臺找出某個目錄下創建時間最早的文件,測試驗證腳本結果是否準確的過程中發現一個很有意思的現象,stat命令在一些平臺下Birth欄位有值,而在一些平臺則為空值,如下所示: RHEL 8.7下, XFS文件系統 [mysql@mysqlu02 ~]$ more /etc/redhat-re ...
  • Ubuntu中恢復rm命令誤刪文件(轉) 電腦系統:Ubuntu 16.04 1 背景 在做項目的時候,本來想使用rm命令刪除以14開頭的文件,結果寫成如下形式: rm 14 * 註意,本來14和*之間不應該有空格的,但是誤寫了一個空格,結果導致所有文件都被刪除了!為了找回被誤刪的文件,根據網上的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...