2015-04-29 101 views
4

在我的Scala代碼中,我需要與Java庫進行交互。將scala.List [scala.Long]轉換爲List <java.util.Long>

我想使用的方法需要List<java.util.Long>類型的參數,但我有斯卡拉類型Option[List[Long]]。我面臨的問題是,我需要手動應用Predef.long2Long功能轉換,從斯卡拉Longjava.util.Long

val userIds = Option(List(1,2,3,4)) 
val methodParameter = userIds.map(list => list.map(long2Long).asJava).orNull 

是有一些方法來此列表轉換中更優雅和簡潔的方式?

編輯:我甚至可以簡化問題:如何將Option[scala.Boolean]轉換爲java.util.Boolean?這裏我需要做同樣的事情:

isUsed.map(isUsedVal => boolean2Boolean(isUsedVal)).orNull, 

回答

2

你能用JavaConverters嗎?做這樣的事情

val sl = new scala.collection.mutable.ListBuffer[Int] 
val jl : java.util.List[Int] = sl.asJava 
+1

在這種情況下,它不會轉換'scala.Int'到'java.util.Int'。它只會將List容器類型從'scala.List'替換爲java'List' – MyTitle

6

對於List[Long]

import scala.collection.JavaConverters._ 

val l = List(1L,2L,3L,4L) 

l.map(java.lang.Long.valueOf).asJava 
// or 
l.map(_.asInstanceOf[AnyRef]).asJava 
// or 
l.map(Long.box).asJava 

對於Option[Boolean]

val mb = Some(true) 

mb.map(java.lang.Boolean.valueOf).orNull 
// or 
mb.map(_.asInstanceOf[AnyRef]).orNull 
// or 
mb.map(Boolean.box).orNull 
1

值得一提的是,long2Longboolean2Boolean是隱含的,但這並不能幫助我想,你可以讓這個更優雅或清晰。它確實允許你的東西,如:

type JB = java.lang.Boolean 
isUsed.fold(null : JB)(implicitly) 
//Or: 
isUsed.map { b => b : JB }.orNull 
//Or even: 
isUsed.map[JB](identity).orNull 

但在我看來,這不是特別可讀。

這些類型的方法是implicit class method的最佳人選。你可以用這些方法豐富你的類,這樣你只需要編寫一次乏味或不雅的代碼。例如,你可能會考慮:

object MoreJavaConversions { 
    import scala.collection.JavaConverters._ 
    implicit class RichListLong(val list: Option[List[Long]]) extends AnyVal { 
     def asJava : java.util.List[java.lang.Long] = list.map(_.map(long2Long).asJava).orNull 
    } 
    implicit class RichOptionBoolean(val bool: Option[Boolean]) extends AnyVal { 
     def asJava : java.lang.Boolean = bool.map(boolean2Boolean).orNull 
    } 
} 

以後將允許你這樣做:

import MoreJavaConversions._ 
val myUsers = Option(List(1l, 2l, 3l)) 

myUsers.asJava //java.util.List[java.lang.Long] 
Option(true).asJava //java.lang.Boolean 
相關問題