小编典典

将java.lang.Boolean转换为Scala布尔

java

我目前正在开发一个Scala应用程序,该应用程序利用Spring-Boot和Swagger发送和接收REST调用。

Swagger和Spring-Boot是纯Java项目,与Scala的兼容性有限,但是我似乎找到了解决该问题的方法。

由于Spring-
Boot和Swagger将请求作为Java对象处理(需要使用setter和getter才能工作),因此我必须将请求视为Java对象,然后将请求转换为更高版本。这是我所做的工作的非常
简化的版本


case class ParamsAsJava(includeMovies: java.lang.Boolean = java.lang.Boolean.FALSE, includeTvShows: java.lang.Boolean = java.lang.Boolean.FALSE) {

  def toScala(): Params = {
    Params(
      includeMovies = convertToScala(includeMovies),
      includeTvShows = convertToScala(includeTvShows)
    )
  }

  private def convertToScala(test: java.lang.Boolean): Boolean
  = if (test == null) false else test.booleanValue

}

case class Params(includeMovies: Boolean = false, includeTvShows: Boolean = false)

object Application extends App {

  val test1 = ParamsAsJava(java.lang.Boolean.FALSE, java.lang.Boolean.TRUE).toScala
  val test2 = ParamsAsJava(java.lang.Boolean.TRUE, java.lang.Boolean.TRUE).toScala
  val test3 = ParamsAsJava().toScala
  val test4 = ParamsAsJava(null, null).toScala
  val test5 = ParamsAsJava(null, java.lang.Boolean.TRUE).toScala

  println(s"Test 1 = $test1")
  println(s"Test 2 = $test2")
  println(s"Test 3 = $test3")
  println(s"Test 4 = $test4")
  println(s"Test 5 = $test5")
}

输出值

测试1 =参数(false,true)

测试2 =参数(true,true)

测试3 = Params(false,false)

测试4 = Params(false,false)

测试5 = Params(false,true)


好吧…我的问题是:

有没有更简单,更易读的方式来实现这一目标?我是否必须每次都调用ParamsAsJava.toScala或是否有一些 很棒的
Scala方法来做到这一点?


阅读 399

收藏
2020-11-26

共1个答案

小编典典

  1. 您不需要java.lang.blah每次都写出
    ParamsAsJava(java.lang.Boolean.FALSE, java.lang.Boolean.TRUE)
    

只需使用

    ParamsAsJava(false, true)

代替。自动装箱一直没有到位。

  1. 要摆脱它toScala,请在Params伴随对象中定义一个隐式转换:
    object Params {
    

    implicit def params_j2s(p: ParamsAsJava): Params = p.toScala()
    }

现在您可以写:

    val test1: Params = ParamsAsJava(true, false)

当然,如果您不是在真空中定义此变量,而是将其传递给方法,则将自动推断出正确的类型,并且将隐式转换对象。

  1. 没有必要使用的括号()def toScala(),该方法没有副作用。
2020-11-26