Scala的控制結構和函數

来源:https://www.cnblogs.com/codegeekgao/archive/2018/09/07/9607608.html
-Advertisement-
Play Games

控制結構和函數 先看以下簡單的一個條件表達式的demo Scala的if/else語法結構與java一樣,如以上代碼一樣,需要註意的是當else部分缺失了比如:if(x 0) 1,這個if語句沒有輸出值,但是在Scala中,每個表達式都應該有值,這個問題可以引入一個Unit類,寫做()。不帶else ...


控制結構和函數

先看以下簡單的一個條件表達式的demo

object TestConditional {

  def main(args: Array[String]): Unit = {
    // scala的if判斷表達式
    var x = 1
    if (x > 0) x = 10 else x = 20
    println(x)
  }
}

Scala的if/else語法結構與java一樣,如以上代碼一樣,需要註意的是當else部分缺失了比如:if(x>0) 1,這個if語句沒有輸出值,但是在Scala中,每個表達式都應該有值,這個問題可以引入一個Unit類,寫做()。不帶else的這個if語句等同於 if (x>0) 1 else () Scala中沒有switch語句,只需if即可解決所有。

  • 語句終止
在java和C++中,每一個語句都以分號結束,而在Scala中和JavaScript類似--行尾的位置不需要分號,因為Scala編譯器能夠從上下文明確判斷出是語句的終止,但是若要在單行中寫下多個語句,需要用分號隔開,例如下麵的表達式需要分號隔開
if (n > 0) {r = r * n; n-=1}
若是在寫較長的語句,需要兩行來寫,需要告訴編譯器不是語句結尾,例子如下:
x = y + (v - m) * d + // +告訴編譯器不是結尾
0.5 * (c - v) * t
  • 塊表達式和賦值
在java中,塊語句是一個包含與{}中的語句序列,在Scala中{}包含一系列表達式,在Scala中,賦值動作本身沒有值,它們是Unit類型,相當於java中的void,而這個類型只有一個值,寫做()
{r = r * n; n-=1}
  • 輸入和輸出
列印一個值可以使用print或者println函數,
例如: println("x="+"10"),另外還有一個帶有C風格格式化的字元串printf函數例如:
printf("hello, %S! welcome to Scala world.\n","michael")
也可以使用readLine函數從控制台讀取一行輸入,讀取數字,Boolean或者是字元,可以永readInt,readDouble,readByte,readShort,readLong,readFloat,readBoolean或者readChar。
// 使用readLine
val name=readLine("your name:")
print("your age")
val age = readInt()
printf("hello,%s! you have %d year work experience",name,age)
  • 迴圈

Scala中沒有與for(初始化變數值;變數布爾表達式;變數更新),Scala中有兩個選擇:一個是使用while迴圈,而是使用以下for語句
for (i<- 表達式)讓變數i遍歷<-右邊的表達式的所有值,對於Scala集合比如Range而言,會取到集合中的每個值

Scala中沒有提供break或者continue語句退出迴圈,一般可以有以下三種方法跳出迴圈:
1. 使用Boolean型的控制變數
2. 使用嵌套函數---使用return
3. 使用breaks對象中的break方法
import scala.util.control.Breaks._
breakable {
    for(...) {
    // 退出迴圈
        if(...) break;
    }
}
  • for迴圈推導式

Scala中的for迴圈比java要豐富的多,下麵介紹其高級特性

    // 多個生成器
    for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j) + " ")
    println()
    // 守衛生成器,if前沒有分號
    for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j) + " ")
    // 可以定義變數,在迴圈中引入
    println()
    for (i <- 1 to 3; from = 4 - i; j <- from to 3) print((10 * i + j) + " ")
    
 for迴圈中的 yield 會把當前的元素記下來,保存在集合中,迴圈結束後將返回該集合。Scala中for迴圈是有返回值的。如果被迴圈的是Map,返回的就是Map,被迴圈的是List,返回的就是List,以此類推。

scala> for (i <- 1 to 5) yield i
res10: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5) 
  • 函數

Scala中定義函數需要定義函數的名稱、參數和函數體

 def abs (x: Double) = if (x >= 0) x else -x
 
 必須給出所有參數的類型,只要不是遞歸就不需指定返回類型。Scala會自動通過=符號右側的表達式的類型推斷出返回類型
 
// 遞歸函數,必須指定返回類型
def fac(n : Int) :Int = if (n<=0) 1 else n* fac(n -1) 
  • 預設參數和帶名參數
/**
 * 我們在調用某些函數無需顯示給出所有的參數值,可以初始化給出預設值
 */
 def haha(str:String,left:String="[",right:String="]") = left + str +right
  • 可變參數
// 傳入的參數是單個參數
def sum(args : Int*):Int = {
    var result = 0
    for (arg <- args) result += arg
    // 返回result
    result
}

// 計算1+2的值
val s1 = sum(1, 2)
// 用法是錯誤的,因為1 to 3 是一個整數區間不是單個整數
val s3 = sum (1 to 3)
// 計算1+2+3的值(解決區間問題)
val s2 = sum(1 to 3: _*)
  • 異常處理
Scala異常的工作機制和java或C++一樣,當你拋出異常時:
throw new IllegalArgumentException("description for exception")
和java一樣,拋出的對象必須是java.lang.Throwable的子類,不過沒有編譯時候的檢查異常
try {
    process(new URL("http:wwww.baidu.com"))
} catch {
    // 自定義異常描述
    case _:URLException => println("bad url")
    // 使用預設異常信息
    case ex: IOException => ex.printStackTrace()
}

使用try finally語句:
var in = new URL("http:www.baidu.com").openStream()
try {
    process(in)
} finally {
    in.close()
}

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

-Advertisement-
Play Games
更多相關文章
  • 在前後端分離的項目中,通常需要啟動一個後臺伺服器來配合前端項目的介面需求。Mockjs的作用是攔截ajax請求並模擬各種數據返回,讓前端開發可以更加自由獨立。 安裝 使用 Mock.mock()第一個參數是需要攔截的介面,第二個參數表明ajax請求類型(get/post/put/delete等),第 ...
  • 將多個系統的登陸認證步驟集中在登陸系統統一管理,用戶只需要登陸一次就可以在多個系統之間來回切換使用 ...
  • 歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "sammyshen" 發表於 "雲+社區專欄" 最近幾年REST API越來越流行,特別是隨著微服務的概念被廣泛接受和應用,很多Web Service都使用了REST API。 REST是HTTP規範主要編寫者之一的Roy ...
  • 搭建zk集群,起碼保證3台虛擬機的配置,本人使用的虛擬機環境為wm14+centos7+jdk1.8 下載地址 下載地址 zk的tar包下載地址:http://mirror.bit.edu.cn/apache/zookeeper/ 安裝方式 安裝方式 下載好tar包後上傳到自己的虛擬機文件夾中,這裡 ...
  • 1、什麼是大數據 基本概念 《數據處理》 在互聯網技術發展到現今階段,大量日常、工作等事務產生的數據都已經信息化,人類產生的數據量相比以前有了爆炸式的增長,以前的傳統的數據處理技術已經無法勝任,需求催生技術,一套用來處理海量數據的軟體工具應運而生,這就是大數據! 處理海量數據的核心技術: 海量數據存 ...
  • Util的開源地址 https://github.com/dotnetcore/util Util的開源協議 Util以MIT協議開源,這是目前最寬鬆的開源協議,你不僅可以用於商業項目,還能把Util的代碼放進你的框架,放心使用。 Util的命名 Util這個名字看上去不怎麼高大上,很多人勸我換個霸 ...
  • Java語言中的異常處理包括聲明異常、拋出異常、捕獲異常和處理異常四個環節。 throw用於拋出異常。 throws關鍵字可以在方法上聲明該方法要拋出的異常,然後在方法內部通過throw拋出異常對象。 try是用於檢測被包住的語句塊是否出現異常,如果有異常,則拋出異常,並執行catch語句。 cac ...
  • 類載入過程 類從被載入到虛擬機記憶體中開始,到卸載出記憶體為止,它的整個生命周期包括:載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段。其 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...