scala常見筆試題 囊括了scala的精髓

2021-09-12 21:43:28 字數 4431 閱讀 4961

scala最近幾年很火,主要是因為其在大資料領域的應用。

下面這些面試題,基本上是scala函式式程式設計的精髓。

q1  var,val和def三個關鍵字之間的區別?

**示例:

var x = 3 // x是int型別

x = 4 //

x = "error" // 型別變化,編譯器報錯'error: type mismatch'

val y = 3

y = 4 //常量值不可更改,報錯 'error: reassignment to val'

def fun(name: string) = "hey! my name is: " + name

fun("scala") // "hey! my name is: scala"

//注意scala中函式式程式設計一切都是表示式

lazy val x =

val y =

x+x //

y+y // x 沒有計算, 列印結果"computing y"

**示例

//宣告乙個類

class myclass(number: int, text: string)

//宣告乙個物件

object myobject

new myclass(3,"text").classmethod() //列印結果test,需要例項化類

myclass.classmethod() //無法直接呼叫類的方法

myobject.objectmethod() //列印結果object,物件可以直接呼叫方法

**示例

//宣告乙個樣本類

case class mycaseclass(number: int, text: string, others: list[int])

//不需要new關鍵字,建立乙個物件

val dto = mycaseclass(3, "text", list.empty) //列印結果3

//利用樣本類預設實現的copy方法

dto.copy(number = 5) //列印結果5

val dto2 = mycaseclass(3, "text", list.empty)

pringln(dto == dto2) // 返回true,兩個不同的引用物件

class myclass(number: int, text: string, others: list[int]) {}

val c1 = new myclass(1, "txt", list.empty)

val c2 = new myclass(1, "txt", list.empty)

println(c1 == c2 )// 返回false,兩個不同的引用物件

**示例:

//定義乙個類

class myclass(number: int, text: string) 

//定義乙個伴生物件

object myclass

myclass.objectsecret // 無法訪問

myclass.classsecret // 無法訪問

new myclass(-1, "random").objectsecret // 無法訪問

new myclass(-1, "random").classsecret // 無法訪問

示例**

//宣告第乙個函式

def func(): int =

//宣告第二個函式,scala預設的求值就是call-by-value

def callbyvalue(x: int) =

//宣告第三個函式,用=>表示call-by-name求值

def callbyname(x: => int) =

//開始呼叫

//call-by-value求值

callbyvalue(func())

//輸出結果

//computing stuff....

//1st x: 42

//2nd x: 42

//call-by-name求值

callbyname(func())

//輸出結果

//computing stuff....

//1st x: 42

//computing stuff....

//2nd x: 42

**示例:

val person: person = getpersonbyidondatabaseunsafe(id = 4) // 如果沒有id=4的person時,返回null物件

println(s"this person age is $") //如果是null,丟擲異常

val personopt: option[person] = getpersonbyidondatabasesafe(id = 4) // 如果沒有id=4的person時,返回none型別

personopt match ")

case none => println("there is no person with that id")

}

**示例:

// <-表示迴圈遍歷

scala> for (i <- 1 to 5) yield i * 2

res0: scala.collection.immutable.indexedseq[int] = vector(2, 4, 6, 8, 10)

示例**:

// 三層迴圈巢狀

for yield

//上面的可轉換為

c1.flatmap(x => c2.flatmap(y => c3.withfilter(z => z > 0).map(z => )))

**示例:**示例:

//返回乙個either型別//返回乙個e

def personage(id: int): either[string, int] =

**示例:

def add(a: int)(b: int) = a + b

val add2 = add(2)(_) //_ 表示不只乙個的意思

scala> add2(3)res0: int = 5

正常遞迴,每一次遞迴步驟,需要儲存資訊到堆疊裡面,當遞迴步驟很多時,導致堆疊溢位。

尾遞迴就是為了解決上述問題,在尾遞迴中所有的計算都是在遞迴之前呼叫,

編譯器可以利用這個屬性避免堆疊錯誤,尾遞迴的呼叫可以使資訊不插入堆疊,從而優化尾遞迴。

使用 @tailrec 標籤可使編譯器強制使用尾遞迴。

**示例:

def sum(n: int): int = else

}@tailrec //告訴編譯器

def tailsum(n: int, acc: int = 0): int = else

}sum(5)

5 + sum(4) // 暫停計算 => 需要新增資訊到堆疊

5 + (4 + sum(3))

5 + (4 + (3 + sum(2)))

5 + (4 + (3 + (2 + sum(1))))

5 + (4 + (3 + (2 + 1)))

15tailsum(5) // tailsum(5, 0) 預設值是0

tailsum(4, 5) // 不需要暫停計算

tailsum(3, 9)

tailsum(2, 12)

tailsum(1, 14)

tailsum(0, 15)

15

常見筆試題記錄

linux命令 1 tcpdump dump the traffic on a network,根據使用者的定義對網路上的資料報進行截獲的包分析工具。tcpdump 可以將網路中傳送的資料報的 頭 完全截獲下來提供分析。它支援針對網路層 協議 主機 網路或埠的過濾,並提供 and or not等邏輯...

c 常見筆試題(4)

40.鍊錶題 乙個鍊錶的結點結構 struct node typedef struct node node 1 已知鍊錶的頭結點head,寫乙個函式把這個鍊錶逆序 intel node reverselist node head 鍊錶逆序 p2 next p1 head p2 return head...

鍊錶常見筆試題

鍊錶的一些常見筆試面試問題總結及 先什麼也不說,假設鍊錶節點的資料結構為 struct node 建立單鏈表的程式為 struct node create unsigned int n node p head for unsigned int i 1 i n i return head 問題1 鍊錶...