简体   繁体   English

如何从Scala字符串转换为Java枚举

[英]How to convert from Scala string to Java enum

I have an API that receives a string representing a language. 我有一个API,它接收表示一种语言的字符串。 My Scala code (using Scalatra for the API) calls into existing Java code that I must support. 我的Scala代码(使用Scalatra作为API)调用了我必须支持的现有Java代码。 This Java code expects the language to be in the form of an enum that it defines. 该Java代码期望该语言采用其定义的枚举形式。

I could exhaustively pattern match on the string to return the proper enum element, but I have to believe there's a better way? 我可以穷尽地对字符串进行模式匹配以返回正确的枚举元素,但我必须相信还有更好的方法吗?

For example, I could do this: 例如,我可以这样做:

      f.language.value.get.toUpperCase.split(",").map {
        case "ALL" => JavaLanguageEnum.ALL
        case "AAA" => JavaLanguageEnum.AAA
        case "BBB" => JavaLanguageEnum.BBB
        case "CCC" => JavaLanguageEnum.CCC
        case "DDD" => JavaLanguageEnum.DDD
        case "EEE" => JavaLanguageEnum.EEE
        case "FFF" => JavaLanguageEnum.FFF
        case _ => JavaLanguageEnum.ALL
      }.toList

... but that would be a pretty big piece of code to do this work. ...但是那将是完成这项工作的一大段代码。 Is there a better way to simply say, "if the string matches one of the enums, return that enum so I can pass it in?" 是否有更好的方法简单地说:“如果字符串与枚举之一匹配,则返回该枚举以便我可以将其传递给它?”

Java's Enum actually already has a method to handle this; Java的Enum实际上已经有一种方法可以处理此问题。 valueOf . valueOf Just pass the String to the method, and wrap it in a try...catch block to handle the case where it doesn't match. 只需将String传递给该方法,然后将其包装在try...catch块中即可处理不匹配的情况。

f.language.value.get.toUpperCase.split(",").map {
  try {
    JavaLanguageEnum.valueOf(_)
  } catch {
    case e: IllegalArgumentException => JavaLanguageEnum.ALL
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM