假設(shè)場(chǎng)景是java某個(gè)函數(shù)返回了一個(gè)byte[]
十多年專注成都網(wǎng)站制作,成都定制網(wǎng)頁(yè)設(shè)計(jì),個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)頁(yè)設(shè)計(jì),高端網(wǎng)頁(yè)制作,對(duì)成都玻璃貼膜等多個(gè)方面,擁有多年的網(wǎng)站營(yíng)銷經(jīng)驗(yàn)。
現(xiàn)在需要在scala代碼中調(diào)用這個(gè)函數(shù),并轉(zhuǎn)換為Array[Byte]
可以先用java寫(xiě)一個(gè)包裝函數(shù),將
返回值
修改為L(zhǎng)istbyte,使用
java.util.Arrays.asList
可以達(dá)成這個(gè)目的
然后在scala中使用轉(zhuǎn)換,例如
import
scala.collection.JavaConversions.asScalaBuffer
val
buffer
=
asScalaBuffer(JavaList)
將結(jié)果轉(zhuǎn)換為一個(gè)buffer,調(diào)用toArray即可轉(zhuǎn)換為Array[Byte]
導(dǎo)入也是沒(méi)有問(wèn)題的,intellij是做了這方面的功能。其實(shí)不導(dǎo)入也是沒(méi)有問(wèn)題的,intellij上建一個(gè)工程,把eclipse的工具復(fù)制曩昔,也是一樣的。你之所以問(wèn)這個(gè)問(wèn)題是不清囂張j2ee的一些基本常識(shí)。eclipse的工程名目和inteliij最終編程的是j2ee的
Java 和 Scala 都支持變參方法, 寫(xiě)在最后的位置上,最基本的調(diào)用方式也都是一樣的,一個(gè)個(gè)羅列過(guò)去。也可以傳入數(shù)組參數(shù),因?yàn)樽儏⒈举|(zhì)上就是一個(gè)數(shù)組,就是把 ... 開(kāi)始位置到最后一個(gè)參數(shù)都收納到數(shù)組中去,所以變參之所以要放在最后的位置上,且一個(gè)方法中最多只能有一個(gè)變參類型。
這里主要是對(duì)比 Scala 對(duì)變參方法的調(diào)用,基本調(diào)用法當(dāng)然是沒(méi)問(wèn)題的,但是在傳入數(shù)組作為變參的參數(shù)列表與 Java 相對(duì)時(shí)就稍有變化了。
另外提一下,如果想傳入 List 作為變參列表,而不是整體作為變參的第一個(gè)元素就是調(diào)用集合的 toArray() 方法轉(zhuǎn)換成一個(gè)數(shù)組傳入。
下面看 Java 中對(duì)變參方法的調(diào)用,參數(shù)列表和數(shù)組
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);
}
}
}
從輸出結(jié)果能夠很明白的看出變參 params 實(shí)際上就是一個(gè)數(shù)組
[Ljava.lang.String;@3f91beef : 3
a
b
c
[Ljava.lang.String;@1a6c5a9e : 2
d
e
我們知道 Scala 和 Java 之間可以互相調(diào)用,現(xiàn)在寫(xiě)一段 Scala 代碼來(lái)調(diào)用 foo() 方法
object ScalaVarArgs {
def main(args: Array[String]) {
JavaVarArgs.foo("a", "b", "c")
// JavaVarArgs.foo(Array[String]("d", "e"))
}
}
JavaVarArgs.foo("a", "b", "c") 調(diào)用沒(méi)問(wèn)題
而 JavaVarArgs.foo(Array[String]("d", "e")) 會(huì)有編譯問(wèn)題
Type mismatch: expected String, actual Array[String]
Java 在調(diào)用變參方法時(shí)可以直接傳入相應(yīng)類型的數(shù)組,而 Scala 確不允許這么做了,因它試圖把 Array[String] 整體作為一個(gè)元素傳遞給 foo() 方法,而 foo() 要求的元素類型是字符串,所以編譯不過(guò)。
而 Scala 這時(shí)該如何使得與 Java 調(diào)用變參方法時(shí)的行為一致呢,那就是在調(diào)用時(shí)再附加說(shuō)明:是要把數(shù)組中的元素逐個(gè)傳遞級(jí)變參,寫(xiě)法
JavaVarArgs.foo(Array[String]("d", "e") :_*)
這樣的調(diào)用輸出就是
本文原始鏈接 , 來(lái)自隔葉黃鶯 Unmi Blog
[Ljava.lang.String;@7a718e31 : 2
d
e
如果從上面的例子說(shuō)來(lái),我們的運(yùn)氣還不錯(cuò),因?yàn)榫幾g器告訴了你出現(xiàn)了什么問(wèn)題。最麻煩的問(wèn)題總是在能編譯,但運(yùn)行時(shí)詭異的情況。
因?yàn)樵谖冶救藢?shí)際中遭遇到的情形是變參類型是 Object 的方法,形如
public static void foo(Object...params) {
System.out.println(params + " : " + params.length);
for(Object o: params) {
System.out.println(o);
}
}
上面把參數(shù)改為 Object...params, 不會(huì)改變 Java 傳數(shù)組調(diào)用它的行為,但卻增加了 Scala 調(diào)用它時(shí)的排錯(cuò)難度。
在 Scala 中使用 foo(Array[String]("d", "e") 調(diào)用并沒(méi)有編譯錯(cuò)誤,加入上面的調(diào)試代碼才發(fā)現(xiàn),不管傳入多大的數(shù)組,總是輸出像
[Ljava.lang.Object;@7814d044 : 1
[Ljava.lang.String;@ea25c1
說(shuō)方法只接收到了一個(gè)元素,類型被識(shí)別為形參的類型,不過(guò)進(jìn)一步遍歷變參,發(fā)現(xiàn)第一個(gè)元素是一個(gè)字符串?dāng)?shù)組,所以 Scala 把 Array[String]("d", "e") 整體作為 params 的第一個(gè)元素傳給了 foo() 方法。寫(xiě)成
foo(Array[String]("d", "e") : _*)
是為了把數(shù)組拆散了傳給 foo() 方法。
起初以為是 Scala 調(diào)用 Java 的變參方法需要這么做,后來(lái)重新用 Scala 實(shí)現(xiàn)下變參方法
def foo(params: AnyRef*) {
println(params + " : " + params.length)
for (s - params) {
println(s)
}
}
用 Scala 代碼來(lái)調(diào)用它,傳入數(shù)組,如果不想整體作為一個(gè)元素時(shí)也必須加上 : _*參數(shù)說(shuō)明,同樣的:
foo(Array[String]("d", "e") :_*)
在寫(xiě)這篇之前,我所認(rèn)定的這是 Scala 調(diào)用變參方法的一個(gè)缺陷, : _* 似乎是一種默認(rèn)行為,現(xiàn)在認(rèn)為這恰恰是 Scala 的一個(gè)靈活性所在。Scala 提供了兩種方式來(lái)傳遞數(shù)組給變參,而為何 Java 不讓數(shù)組整體作為變參的一個(gè)元素呢,不過(guò) Scala 放開(kāi)這一特性,當(dāng)變參為 Object... params 確實(shí)放大了 Bug 的出現(xiàn)機(jī)率。
scala中的collect分為mutable和immutable兩種,分別在scala.collection.mutable 和scala.collection.immutable package下。但是有時(shí)候我們需要將scala中的collection,比如Seq, ArrayBuffer等轉(zhuǎn)換為java中的List, 以便存到數(shù)據(jù)庫(kù)中,以數(shù)組或List的形式存在。
比如,我們通過(guò)spark任務(wù)得到了一個(gè)Seq[Long]類型的變量,并希望將其保存到MongoDB中。我們通常會(huì)這樣處理:
(1)生成一個(gè)BasicDBObject對(duì)象,val obj = new BasicDBObject();
(2)obj.put(key, value), value為我們需要保存的Seq[Long], 但是需要注意的是value必須是java的類型,由于java不支持Seq[Long]類型,所以需要將其轉(zhuǎn)換為L(zhǎng)ist[Long]類型。
如何轉(zhuǎn)換呢?
scala提供了一個(gè)implicit conversion機(jī)制,只需要引入scala.collection.JavaConversions._, 然后顯示轉(zhuǎn)換即可。具體參見(jiàn)
例如,上面的代碼可以寫(xiě)成:
import scala.collection.JavaConversions._
val jul: java.util.List[Long] = visitors // 其中visitors類型為Seq[Long]類型
obj.put("visitors", jul)
值得注意的是,scala和java類型之間的轉(zhuǎn)換,并不會(huì)發(fā)生拷貝。例如先將java容器轉(zhuǎn)換為scala容器,然后將該scala容器再轉(zhuǎn)換成java容器,實(shí)際上兩個(gè)對(duì)象都指向同一片內(nèi)存區(qū)域。
新聞標(biāo)題:scala代碼轉(zhuǎn)java Scala代碼
URL鏈接:http://chinadenli.net/article24/dodcice.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、關(guān)鍵詞優(yōu)化、、網(wǎng)站收錄、服務(wù)器托管、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)