代码之家  ›  专栏  ›  技术社区  ›  Mr.Turtle

将java.lang.Boolean转换为Scala Boolean

  •  0
  • Mr.Turtle  · 技术社区  · 6 年前

    我目前正在开发一个Scala应用程序,它利用Spring-Boot和Swagger发送&接听休息电话。

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

    关于我所做的:


    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=参数(假,真)

    测试3=参数(假,假)

    测试5=参数(假,真)


    好 啊。。。我的问题是:

    有更简单的方法吗&更具可读性的实现方法? 令人惊叹的

    2 回复  |  直到 6 年前
        1
  •  2
  •   Andrey Tyukin    6 年前
    1. 你不需要写出来 java.lang.blah 每次进来

      ParamsAsJava(java.lang.Boolean.FALSE, java.lang.Boolean.TRUE)
      

      ParamsAsJava(false, true)
      

    2. 摆脱 toScala ,在中定义隐式转换 Params 伴奏对象:

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

      现在你可以写:

      val test1: Params = ParamsAsJava(true, false)
      

      当然,如果您不是在真空中定义这个变量,而是将它传递给一个方法,那么将自动推断正确的类型,并且隐式地转换对象。

    3. 不需要使用parens () def toScala() 方法无副作用。

        2
  •  3
  •   prayagupa soxunyi    6 年前

    或者你可以告诉Spring使用 ScalaObjectMapper

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-scala_2.12</artifactId>
        <version>2.9.7</version>
    </dependency>
    

    WebMvcConfigurerAdapter . 例子;

    import com.fasterxml.jackson.module.scala.DefaultScalaModule
    import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
    import scala.collection.JavaConverters._
    
    @EnableWebMvc
    @Configuration
    @PropertySource(Array("classpath:config/default.properties"))
    @ComponentScan(Array(
      "com.prayagupd"
    ))
    @Order(HIGHEST_PRECEDENCE)
    class MyAppConfig extends WebMvcConfigurerAdapter {
    
      override def extendMessageConverters(converters: java.util.List[HttpMessageConverter[_]]): Unit = {
        val encodeDecoderOpt = converters.asScala.collectFirst { case p: MappingJackson2HttpMessageConverter => p }
    
        val jacksonConverter = encodeDecoderOpt.getOrElse(new MappingJackson2HttpMessageConverter)
        jacksonConverter.setObjectMapper(Config.objectMapper)
    
        if (encodeDecoderOpt.isEmpty) // because converters is mutable
           converters.add(jacksonConverter)
      }
    }
    
    
    object Config {
    
      @Bean
      def objectMapper: ObjectMapper = {
        new ObjectMapper() with ScalaObjectMapper
      }.registerModule(DefaultScalaModule)
    }
    

    @RestController
    @CrossOrigin(origins = Array("*"))
    @RequestMapping(value = Array("/"))
    class MyController @Autowired()(implicit val jacksonObjectMapper: ObjectMapper) {
      import MyController._
    
      @Async
      @RequestMapping(value = Array("/talk"), method = Array(RequestMethod.POST), consumes = Array(MediaType.APPLICATION_JSON_VALUE), produces = Array(MediaType.APPLICATION_JSON_VALUE))
      def talk(@RequestBody request: MyRequest): MyResponse = {
           // goes here
       }
    }
    
    //expose these in client jar if you want
    object MyController {
      final case class MyRequest(includeMovies: Boolean, includeTvShows: Boolean, somethingElse: List[String])
    
      final case class MyResponse(whatever: String)
    }
    
        3
  •  1
  •   Karthik P    5 年前

    我用的是scala.Boolean box unbox 方法。