2015-04-29 65 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 
相关问题