簡體   English   中英

將scala.List [scala.Long]轉換為List <java.util.Long>

[英]Convert scala.List[scala.Long] to List<java.util.Long>

在我的Scala代碼中,我需要與Java庫進行交互。

我想要使​​用的方法需要List<java.util.Long>類型的參數,但我有Scala類型Option[List[Long]] 我遇到的問題是我需要手動應用Predef.long2Long函數將Scala Long轉換為java.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,

對於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

你可以使用JavaConverters嗎? 並做那樣的事情

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

值得一提的是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

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

這些類型的方法是隱式類方法的完美候選。 您可以使用這些方法豐富您的類,這樣您只需編寫一次繁瑣或不優雅的代碼。 例如,您可以考慮:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM