① Scala和java比較
1、 scala可以編寫腳本,編寫一個.scala的腳本代碼,直接用同scala x.scala進行執行。
但同時scala也可以類似java,通過scalac編譯為.class等形式,基於編譯執行。
2、 scala可以在互動式的命令中直接編碼運行。
3、 支持隱式變數定義,通過var關鍵詞定義一個變數,具體變數類型在賦值後,scala自行進行類型推斷。例如var a = List(1,2,3)
4、 常量定義用val 關鍵詞定義
5、 沒有靜態類型,通過object 定義單例類,main方法就是放在object類型中。
② Spark 中用 Scala 和 java 開發有什麼區別
語言不同:Scala 是一門函數式語言,Java是面向對象語言,二者在語言特點上差異特別大。但是scala也是運行在java虛擬機上,兩者可以方便的互相調用。
Spark作為一個數據統計分析的工具,它是偏向於函數式處理的思想,因此在spark應用開發時,天然與scala親近,所以用scala寫spark十分的簡潔明了,用java代碼100行寫出來的spark程序,可能用scala幾行就搞定了。
Java寫spark則是java出生的開發人員快速使用spark的最佳選擇。另外,Java 8之後,也添加了一些函數式語言得語法,這使得Java寫spark簡潔不少。
③ scala.reflect.classtag<t> java怎麼傳入
Java 和 Scala 都支持變參方法, 寫在最後的位置上,最基本的調用方式也都是一樣的,一個個羅列過去。也可以傳入數組參數,因為變參本質上就是一個數組,就是把 ... 開始位置到最後一個參數都收納到數組中去,所以變參之所以要放在最後的位置上,且一個方法中最多隻能有一個變參類型。
這里主要是對比 Scala 對變參方法的調用,基本調用法當然是沒問題的,但是在傳入數組作為變參的參數列表與 Java 相對時就稍有變化了。
另外提一下,如果想傳入 List 作為變參列表,而不是整體作為變參的第一個元素就是調用集合的 toArray() 方法轉換成一個數組傳入。
下面看 Java 中對變參方法的調用,參數列表和數組
public class JavaVarArgs {
public static void main(String[] args) {
foo("a", "b", "c");
foo(new String[]{"d", "e"});
}
public static void foo(String...params) {
System.out.println(params + " : " + params.length);
for(String s: params) {
System.out.println(s);
}
}
}
從輸出結果能夠很明白的看出變參 params 實際上就是一個數組
[Ljava.lang.String;@3f91beef : 3
a
b
c
[Ljava.lang.String;@1a6c5a9e : 2
d
e
我們知道 Scala 和 Java 之間可以互相調用,現在寫一段 Scala 代碼來調用 foo() 方法
object ScalaVarArgs {
def main(args: Array[String]) {
JavaVarArgs.foo("a", "b", "c")
// JavaVarArgs.foo(Array[String]("d", "e"))
}
}
JavaVarArgs.foo("a", "b", "c") 調用沒問題
而 JavaVarArgs.foo(Array[String]("d", "e")) 會有編譯問題
Type mismatch: expected String, actual Array[String]
Java 在調用變參方法時可以直接傳入相應類型的數組,而 Scala 確不允許這么做了,因它試圖把 Array[String] 整體作為一個元素傳遞給 foo() 方法,而 foo() 要求的元素類型是字元串,所以編譯不過。
而 Scala 這時該如何使得與 Java 調用變參方法時的行為一致呢,那就是在調用時再附加說明:是要把數組中的元素逐個傳遞級變參,寫法
JavaVarArgs.foo(Array[String]("d", "e") :_*)
這樣的調用輸出就是
本文原始鏈接 , 來自隔葉黃鶯 Unmi Blog
[Ljava.lang.String;@7a718e31 : 2
d
e
如果從上面的例子說來,我們的運氣還不錯,因為編譯器告訴了你出現了什麼問題。最麻煩的問題總是在能編譯,但運行時詭異的情況。
因為在我本人實際中遭遇到的情形是變參類型是 Object 的方法,形如
public static void foo(Object...params) {
System.out.println(params + " : " + params.length);
for(Object o: params) {
System.out.println(o);
}
}
上面把參數改為 Object...params, 不會改變 Java 傳數組調用它的行為,但卻增加了 Scala 調用它時的排錯難度。
在 Scala 中使用 foo(Array[String]("d", "e") 調用並沒有編譯錯誤,加入上面的調試代碼才發現,不管傳入多大的數組,總是輸出像
[Ljava.lang.Object;@7814d044 : 1
[Ljava.lang.String;@ea25c1
說方法只接收到了一個元素,類型被識別為形參的類型,不過進一步遍歷變參,發現第一個元素是一個字元串數組,所以 Scala 把 Array[String]("d", "e") 整體作為 params 的第一個元素傳給了 foo() 方法。寫成
foo(Array[String]("d", "e") : _*)
是為了把數組拆散了傳給 foo() 方法。
起初以為是 Scala 調用 Java 的變參方法需要這么做,後來重新用 Scala 實現下變參方法
def foo(params: AnyRef*) {
println(params + " : " + params.length)
for (s <- params) {
println(s)
}
}
用 Scala 代碼來調用它,傳入數組,如果不想整體作為一個元素時也必須加上 : _*參數說明,同樣的:
foo(Array[String]("d", "e") :_*)
在寫這篇之前,我所認定的這是 Scala 調用變參方法的一個缺陷, : _* 似乎是一種默認行為,現在認為這恰恰是 Scala 的一個靈活性所在。Scala 提供了兩種方式來傳遞數組給變參,而為何 Java 不讓數組整體作為變參的一個元素呢,不過 Scala 放開這一特性,當變參為 Object... params 確實放大了 Bug 的出現機率。
④ 求助!scala如何調用java靜態方法
Scala沒有靜態方法或靜態欄位,可以用object這個語法結構來達到同樣的目的,對象定義了某個類的單個實例,包含了你想要的特性。
例如:
object Accounts{
private var lastNumber = 0
def newUniqueNumber()={lastNumber+=1;lastNumber}
}
當你在應用程序中需要一個新的唯一賬號時,調用Account.newUniqueNumber()即可。
⑤ Scala和Java,到底該使用哪一種大數據編程語
scala底層用到的還是java,只是在java上套了一層殼
由於scala最終被編譯為.class 所以其實本質上還是java 所以在scala中可以任意的調用java的api
.java –> .class –> jvm
.scala –> .class –> jvm