Scala Class etc. 2

来源:https://www.cnblogs.com/yuanzam/archive/2019/09/30/11614233.html
-Advertisement-
Play Games

Higher Order Functions 定義的是方法,而不是函數 函數可作為變數存在,可直接調用,也可作為值傳遞給其他函數 尾碼將普通方法變為函數: 根據上下文編譯器可以自動將方法轉換為函數,也可省略 尾碼 高階函數,接收函數的函數 參數類型推導 匿名函數傳遞給其他函數或方法時,如果一直到參數 ...


Higher-Order Functions

  • def 定義的是方法,而不是函數
  • 函數可作為變數存在,可直接調用,也可作為值傳遞給其他函數
  • _ 尾碼將普通方法變為函數: ceil _
    • 根據上下文編譯器可以自動將方法轉換為函數,也可省略 _ 尾碼
  • 高階函數,接收函數的函數
  • 參數類型推導
    • 匿名函數傳遞給其他函數或方法時,如果一直到參數類型,則可省略匿名函數的參數類型,可自動推導類型
    • 參數只有一個時可省略括弧
      • 當參數在右側只出現一次時,可使用 _ 簡寫
  • 閉包 Closures,特定作用域
  • SAM, single abstract method interface
    • 對應 Java 中的函數式介面 (1.8)
    • 可將 Scala 函數傳遞給 Java,只在函數字面量中起作用
  • 柯里化 Currying
    • 將接收兩個參數的函數變為接收第一個參數的函數,該函數返回一個消費第二個參數的函數
  • 控制抽象 Control Abstractions
    • Scala 只包含少量的流程式控制制語句,用戶可自定義控制語句

Pattern Matching and Case Classes

  • 可對任何類型進行模式匹配,匹配順序從上至下
  • 模式匹配代替 switch,預設分支為 case _;可避免 switch 語句中因缺少 break 帶來的 fall-through 問題
  • 模式匹配也是表達式,可將其返回值直接賦值給變數
  • 模式守衛 / guards,為匹配設置條件,任何 Boolean 條件都可作為模式守衛;case ... if ... => ...
  • case 關鍵字後接變數名或對應數據結構中使用變數名,那麼匹配項就賦值給該變數,變數名必須以小寫字母開頭
  • 使用 | 分隔同一匹配的多個可選項,此時不可使用變數綁定元素
  • 類型匹配,代替 isInstanceOfasInstanceOf,直接進行類型轉換
    • 必須為類型指定變數名,否則匹配的是實際的類型對象
    • 匹配在運行時發生,而 JVM 泛型會被擦除
      • 不可以匹配具體的 Map 類型(可使用 case Map[_, _],不可使用 case Map[Int, Int]
      • Array 的類型不會被擦除
  • 解構 destructuring
    • 匹配數組

      case Array(x, y) => s"$x $y"  // 匹配長度為2的數組,並將分別綁定到 x, y
      case Array(0, rest @ _*) => rest.min // 可變參數
    • 匹配 List

      case x :: y :: Nil => ...  // 綁定參數
      case head :: tail => ...  // 解構 head , tail
    • 匹配元組

      case (0, _) => ... // 匹配第一個元素為0
      case (x, y) => ... // 綁定參數
  • 定義變數,註意一定要小寫開頭;其實等價於 match 模式匹配加上賦值操作
    • val (x, y) = (1, 2)
    • val Array(f, s, rest @ _*) = arr
  • 用於 for 迴圈遍歷集合,匹配符合條件的元素

    for ((k, v) <- System.getProperties()) println(s"$k $v")
    // 匹配 value 為 "" 的項,其他的則被忽略
    for ((k, "") <- System.getProperties()) println(k)
    // if guard 過濾
    for ((k, v) <- System.getProperties() if v == "") println(k)
  • Case Class
    • 用於模式匹配的特殊類
    • 構造參數預設為 val,預設提供 applyunapplytoStringequalshashCodecopy
      • copy 用於複製對象時,可使用命名參數來修改屬性
    • case class X 使用時 case X() => ...,需要括弧
    • case object S 單例,使用時 case S => ..., 不要括弧
    • :: 也是 case class,配合中綴表達式,就是常見的匹配方式,case head :: tail,實際調用 ::(head, tail)
    • 可用於嵌套的結構;綁定變數、可變參數匹配類似
    • 適用於固定結構的類,如 List
  • sealed 密封的
    • 被修飾的類,則其子類必須和該類在同一個文件中定義
    • 在編譯時即確定了所有匹配項的可能性
  • Option 也是使用 case class 來表示是否有值存在的
    • 子類 Some 封裝值,子類 None 表示無值
    • 相比使用 ""null 更加安全
    • Map 進行 get 操作返回的也是 Option,也可使用模式匹配來處理
    • getOrElse 嘗試獲取值,未獲取到則使用給定的值
  • Partial Function 偏函數
    • 沒有對所有輸入進行定義的函數
    • apply 從模式匹配中計算函數值,isDefinedAt 判斷輸入是否匹配定義的模式
    • case 語句塊是偏函數
    • PartialFunction[A, B] 的實例, A 為輸入類型,B 為輸出類型
      • 可使用偏函數的 lift 方法,將偏函數變為常規函數,返回值為 Option[B]
      • 也可以通過 Function.unlift 將返回 Option[B] 的函數變為偏函數
    • Seq[A] 也是偏函數 PartialFunction[Int, A]
    • Map[K, V] 也是偏函數 PartialFunction[K, V]
    • catch 語句也是偏函數,可在 catch 塊中使用模式匹配處理異常

註解

  • Scala 中註解可影響代碼編譯,如 @BeanProperty 會自動生成 getter/setter
  • 可用於 類、方法、欄位、變數、參數等
    • 多個註解無順序
    • 主構造器的註解,需要加括弧 class Credential @Inject() (var username: String, var password: String)
    • 表達式的註解,使用分號加註解的方式 (map.get(key): @unchecked) ...
    • 類型參數的註解,class Test[@specialized T]
    • 實際類型的註解,放在類型之後,def name: String @Localized
  • 註解實現
    • 註解必須繼承 Annotation
    • 類型註解必須繼承 TypeAnnotation
    • 元註解 @param, @field, @getter, @setter, @beanGetter, @beanSetter
  • 對應 Java 修飾符、標記介面
    • @volatile 對應 volatile 關鍵字
    • @transient 對應 transient 關鍵字
    • @strictfp 對應 strictfp 關鍵字
    • @native 對應 native 關鍵字
    • @cloneable 對應 Cloneable
    • @remote 對應 java.rmi.Remote
    • @SerialVersionUID 代替序列化欄位
  • 使用 @throws(classOf[Exception]) 來處理 Java 中的受檢異常
  • @varargs 處理可變參數
    • @varargs def name(args: String*) 生成 void name(String... args)
    • 沒有 @varargs 則可變參數會被轉換成 Seq[T]
  • 優化
    • @tailrec 會嘗試優化尾遞歸調用,將其變為迴圈
    • @switch 編譯器會檢查 match 表達式是否編譯為 ableswitchlookupswitch,如果被編譯成一系列條件表達式,則會拋出異常
    • @inline, @noinline 建議編譯器是否將方法替換為行內調用
    • @elidable, 用於標註在生產代碼中可移除的方法
      • elidable 對象定義了很多級別常量可直接使用,未指定參數時預設是 SERVERE 即 1000(包含1000)
    • @specialized 處理基礎類型,自動生成基礎類型對應包裝類的方法

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

-Advertisement-
Play Games
更多相關文章
  • 一.面向對象的概念 面向對象編程(Object-oriented Programming,簡稱 OOP),是一種封裝代碼的方法 為什麼要有面向對象:是為了更好地模擬現實世界的事物,並把描述特征的數據和代碼塊(函數)封裝到一起 比如說,將亂七八糟的數據扔進列表中,這就是一種簡單的封裝,是數據層面的封裝 ...
  • 《菜鳥程式員成長之路:從技術小白到阿裡巴巴Java工程師》 國慶節快樂!一年一度長度排第二的假期終於來了。 難得有十一長假,作者也想要休息幾天啦。 不管你是選擇出門玩,還是在公司加班,在學校複習,都希望你過好這個長假。 沒有出去玩的也不用羡慕別人,利用這段時間充充電,不比去旅游看人頭要好的多嗎? 最 ...
  • 在Mybatis中,我們通常會像下邊這樣用: 返回一個結果 返回多個結果(其實這個和上邊一樣,只不過是查詢條件的控制而已) 我們只要將上邊的 改為 ,這會有生成下邊這樣 上這結果就是說,以User類的屬性名為key,屬性值為value。 當然,也可以查出來多條記錄,將這個Map放進List中 但是有 ...
  • Django 一、web框架 框架,即時framework,特指為解決一個開放性問題而設計的具有一定約束性的支撐結構,使用框架可以幫你快速開發特定的系統,簡單的說,就是用別人搭建好的舞臺來表演你的才藝。 對於所有的web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket ...
  • # 今日內容: 1. Servlet 2. HTTP協議 3. Request ## Servlet: 1. 概念 2. 步驟 3. 執行原理 4. 生命周期 5. Servlet3.0 註解配置 6. Servlet的體繫結構 Servlet -- 介面 | GenericServlet -- 抽 ...
  • 在學習Elasticsearch 時候,因為各個版本的問題,搞不清,非常的頭疼,官方也給出了各個版本更新的情況,不過是英文版本,版本更新信息又特別多,最近學習,看了很多資料,沒有一個整理很清楚的,然後自己就統一整理下,首先聲明下麵的整理都是各個版本個人認為比較重要點,因為每個大版本更新內容太多,也不 ...
  • python裝飾器就是用於拓展原來函數功能的一種函數,這個函數的特殊之處在於它的返回值也是一個函數,使用python裝飾器的好處就是在不用更改原函數的代碼前提下給函數增加新的功能。 3.1 定義裝飾器,定義函數。 def xxx(): 函數體 3.2 應用裝飾器 在需要使用的函數、方法上@xxx即可 ...
  • 摘要 作為一個web開發者,每天都在使用者Http協議,卻總是一知半解。本文參看Http RFC7230規範,梳理了http報文部分。 http 報文構成 start line: 起始行,描述請求或響應的基本信息 ( header field CRLF ): 頭 CRLF [ message bod ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...