将包含Boolean的Scala映射转换为包含java.lang.Boolean的Java映射

fle*_*end 12 java interop scala

我想将带有布尔值的scala映射转换为带有java.lang.Boolean值的java映射(用于互操作性).

import scala.collection.JavaConversions._

val a = Map[Int, Boolean]( (1, true), (2, false) )
val b : java.util.Map[Int, java.lang.Boolean] = a
Run Code Online (Sandbox Code Playgroud)

失败了:

error: type mismatch;
found   : scala.collection.immutable.Map[Int,scala.Boolean]
required: java.util.Map[Int,java.lang.Boolean]
val b : java.util.Map[Int, java.lang.Boolean] = a
Run Code Online (Sandbox Code Playgroud)

JavaConversions隐式转换很适合在相同类型上参数化的容器,但不知道Boolean和java.lang.Boolean之间的转换.

我可以使用JavaConversions魔术来执行此转换,还是有一个简洁的语法来执行转换而不使用该包中的隐式转换?

lee*_*777 12

虽然JavaConversions将Scala Map转换为a java.util.Map,并且Scala隐式转换scala.Booleanjava.lang.Boolean,但Scala不会执行两次隐式转换来获取所需的类型.

Boolean提供了box一种显式转换方法.

val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(Boolean.box)
Run Code Online (Sandbox Code Playgroud)

如果您经常在代码中执行此操作,则可以为所有人定义自己的隐式转换Map[T, Boolean].

import scala.collection.JavaConversions._

implicit def boolMap2Java[T](m: Map[T, Boolean]): 
  java.util.Map[T, java.lang.Boolean] = m.mapValues(Boolean.box)

val b: java.util.Map[Int, java.lang.Boolean] = a
Run Code Online (Sandbox Code Playgroud)


Tra*_*own 10

scala.collection.JavaConversions是不会帮助你的scala.Booleanjava.lang.Boolean的问题.但是,以下boolean2Boolean方法可以使用以下方法scala.Predef:

val a = Map[Int, Boolean](1 -> true, 2 -> false)
val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(boolean2Boolean)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用Java的Boolean(boolean value)构造函数:

val a = Map[Int, Boolean](1 -> true, 2 -> false)
val b: java.util.Map[Int, java.lang.Boolean] = 
         a.mapValues(new java.lang.Boolean(_))
Run Code Online (Sandbox Code Playgroud)

或者您可以声明第一个映射使用Java引用类型:

val a = Map[Int, java.lang.Boolean](1 -> true, 2 -> false)
val b: java.util.Map[Int, java.lang.Boolean] = a
Run Code Online (Sandbox Code Playgroud)