日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Scala基础 - 下划线使用指南

發布時間:2025/6/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala基础 - 下划线使用指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

歡迎訪問PlayScala社區(http://www.playscala.cn)

下劃線這個符號幾乎貫穿了任何一本Scala編程書籍,并且在不同的場景下具有不同的含義,繞暈了不少初學者。正因如此,下劃線這個特殊符號無形中增加Scala的入門難度。本文希望幫助初學者踏平這個小山坡。

1. 用于替換Java的等價語法

由于大部分的Java關鍵字在Scala中擁有了新的含義,所以一些基本的語法在Scala中稍有變化。

1.1 導入通配符

*在Scala中是合法的方法名,所以導入包時要使用_代替。

//Java import java.util.*;//Scala import java.util._

1.2 類成員默認值

Java中類成員可以不賦初始值,編譯器會自動幫你設置一個合適的初始值:

class Foo{//String類型的默認值為nullString s; }

而在Scala中必須要顯式指定,如果你比較懶,可以用_讓編譯器自動幫你設置初始值:

class Foo{//String類型的默認值為nullvar s: String = _ }

該語法只適用于類成員,而不適用于局部變量。

1.3 可變參數

Java聲明可變參數如下:

public static void printArgs(String ... args){for(Object elem: args){System.out.println(elem + " ");} }

調用方法如下:

//傳入兩個參數 printArgs("a", "b"); //也可以傳入一個數組 printArgs(new String[]{"a", "b"});

在Java中可以直接將數組傳給printArgs方法,但是在Scala中,你必須要明確的告訴編譯器,你是想將集合作為一個獨立的參數傳進去,還是想將集合的元素傳進去。如果是后者則要借助下劃線:

printArgs(List("a", "b"): _*)

1.4 類型通配符

Java的泛型系統有一個通配符類型,例如List<?>,任意的List<T>類型都是List<?>的子類型,如果我們想編寫一個可以打印所有List類型元素的方法,可以如下聲明:

public static void printList(List<?> list){for(Object elem: list){System.out.println(elem + " ");} }

對應的Scala版本為:

def printList(list: List[_]): Unit ={list.foreach(elem => println(elem + " ")) }

2 模式匹配

2.1 默認匹配

str match{case "1" => println("match 1")case _ => println("match default") }

2.2 匹配集合元素

//匹配以0開頭,長度為三的列表 expr match {case List(0, _, _) => println("found it")case _ => }//匹配以0開頭,長度任意的列表 expr match {case List(0, _*) => println("found it")case _ => }//匹配元組元素 expr match {case (0, _) => println("found it")case _ => }//將首元素賦值給head變量 val List(head, _*) = List("a")

3. Scala特有語法

3.1 訪問Tuple元素

val t = (1, 2, 3) println(t._1, t._2, t._3)

3.2 簡寫函數字面量(function literal)

如果函數的參數在函數體內只出現一次,則可以使用下劃線代替:

val f1 = (_: Int) + (_: Int) //等價于 val f2 = (x: Int, y: Int) => x + ylist.foreach(println(_)) //等價于 list.foreach(e => println(e))list.filter(_ > 0) //等價于 list.filter(x => x > 0)

3.3 定義一元操作符

在Scala中,操作符其實就是方法,例如1 + 1等價于1.+(1),利用下劃線我們可以定義自己的左置操作符,例如Scala中的負數就是用左置操作符實現的:

-2 //等價于 2.unary_-

3.4 定義賦值操作符

我們通過下劃線實現賦值操作符,從而可以精確地控制賦值過程:

class Foo {def name = { "foo" }def name_=(str: String) {println("set name " + str)}val m = new Foo()m.name = "Foo" //等價于: m.name_=("Foo")

3.5 定義部分應用函數(partially applied function)

我們可以為某個函數只提供部分參數進行調用,返回的結果是一個新的函數,即部分應用函數。因為只提供了部分參數,所以部分應用函數也因此而得名。

def sum(a: Int, b: Int, c: Int) = a + b + c val b = sum(1, _: Int, 3) b: Int => Int = <function1> b(2) //6

3.6 將方法轉換成函數

Scala中方法和函數是兩個不同的概念,方法無法作為參數進行傳遞,也無法賦值給變量,但是函數是可以的。在Scala中,利用下劃線可以將方法轉換成函數:

//將println方法轉換成函數,并賦值給p val p = println _ //p: (Any) => Unit

4. 小結

下劃線在大部分的應用場景中是以語法糖的形式出現的,可以減少擊鍵次數,并且代碼顯得更加簡潔。但是對于不熟悉下劃線的同學閱讀起來稍顯困難,希望通過本文能夠幫你解決這個的困惑。本文成文倉促,如有遺漏,歡迎留言! 轉載請注明作者: joymufeng

轉載于:https://my.oschina.net/joymufeng/blog/863823

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Scala基础 - 下划线使用指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。