如何在scala中将查询参数中的字符串receive转换为enums对象?

如何在scala中将查询参数中的字符串receive转换为enums对象?,scala,enums,Scala,Enums,因为据我所知,不可能将Enum作为查询参数来接收,所以如何正确地更改我获取到Enum对象的字符串 我的路线: POST /goto controllers.goToAPlace(place: String) 我的枚举: object Place extends Enumeration { type Place = Value val Italy, United States, Rome = Value } 那么现在,当我在goToAPlace中获取它时,什么是将它转换为我的枚举的

因为据我所知,不可能将Enum作为查询参数来接收,所以如何正确地更改我获取到Enum对象的字符串

我的路线:

POST  /goto  controllers.goToAPlace(place: String)
我的枚举:

object Place extends Enumeration {
  type Place = Value
  val Italy, United States, Rome = Value
}
那么现在,当我在
goToAPlace
中获取它时,什么是将它转换为我的枚举的正确方法

我希望能够做到以下几点:

def goToAPlace(place: String) = {
if (place.isEqual(Italy)){
//do something
}
}

感谢Scala中的,如果您只需要采取不同的操作,可以使用
match
语句:

place match {
  case "Italy" => // do something
  case "France" => // do something else
  case _ => // all others
}
如果收到的字符串不是有效的Scala标识符,也可以使用Java枚举。这将为您提供一个
地图
。您可以使用映射将
place:String
转换为您的枚举:

import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
public enum WithFrom {
    TWO("one plus 1"), SIX("two plus 4");

    WithFrom(String expr) {
        this.expr = expr;
    }

    private final String expr;

    public static final Map<String, WithFrom> fromValue = Collections
            .unmodifiableMap(new HashMap<String, WithFrom>() {
                private static final long serialVersionUID = 7205142682214758287L;

                {
                    for (WithFrom wf : WithFrom.values()) {
                        put(wf.expr, wf);
                    }
                }
            });
}
import java.util.Collections;
导入java.util.Map;
导入java.util.HashMap;
公共枚举WithFrom{
二(“一加一”)、六(“二加四”);
WithFrom(字符串表达式){
this.expr=expr;
}
私有最终字符串表达式;
公共静态最终映射fromValue=集合
.unmodifiableMap(新的HashMap(){
私有静态最终长serialVersionUID=7205142682214758287L;
{
for(WithFrom wf:WithFrom.values()){
put(wf.expr,wf);
}
}
});
}

捷径是:

Place.withName(place) == Italy
请注意,如果在枚举中找不到该值,上述代码将引发异常。以下是使用选项处理无效输入的更安全方法:

Place.values.find(_.toString == place).contains(Italy)

如果您确定名称与枚举中的一个值匹配,或者如果您确实希望引发异常,请首先使用
Place.withName(Place)
将字符串转换为枚举,然后对其进行模式匹配:
Place.withName(Place)match{case意大利=>…}
,请记住导入必要的内容。事实上,您从查询参数中获取字符串在这里是不相关的,因此排除它会简单得多,但是您的问题会减少到,您还可以在Scala文档中找到问题的答案。这并不是所问的问题。使用Java枚举在这里不是一个选项。显然,PO希望利用Scala
Enumeration
s,简单地将字符串解析为
Enumeration
我提供了
match
语句,因为它可以做他想要的事情,而不必转换为enum。我还提供了一个Java枚举,因为它可以用于他接收的字符串不是有效的Scala标识符的情况。