Scala соответствие шаблону Java enum value
У меня есть мое перечисление java, например: FOO("foo")
, BAR("bar")
...
и у меня есть метод getValue()
, чтобы вернуть значение "foo"
и "bar"
перечисления, и это должно быть в Java.
С другой стороны, мне нужно сопоставить это в Scala:
result match {
case "foo" =>
Я пытаюсь сделать:
result match {
case Enum.FOO.getValue() =>
Я получаю эту ошибку:
method getValue is not a case class constructor, nor does it have an
unapply/unapplySeq method
Я не совсем уверен, что происходит здесь, так как мой метод getValue()
возвращает String
, поэтому почему я не могу использовать его для сопоставления с образцом? Благодаря
Ответы
Ответ 1
Вы можете сопоставить соответствие шаблонов Java, но вы не можете вызвать методы в части деструктурирования. Итак, это работает:
j match { case Jenum.FOO => "yay"; case _ => "boo" }
if j
- это экземпляр вашего перечисления Java (с меткой Jenum
).
Однако вы можете сделать что-то вроде этого:
"foo" match {
case s if s == Jenum.FOO.getValue => "yay"
case _ => "boo"
}
Или вы можете сначала преобразовать свою строку в enum:
Jenum.values.find(_.getValue == "foo") match {
case Some(Jenum.FOO) => "yay"
case _ => "boo"
}
(вы также можете сначала отключить опцию, чтобы избежать повторения Some(...)
столько раз).
Для справки, это тестовое перечисление, которое я использовал (Jenum.java):
public enum Jenum {
FOO("foo"), BAR("bar");
private final String value;
Jenum(String value) { this.value = value; }
public String getValue() { return value; }
}
Ответ 2
Вы не можете использовать результат вызова метода как шаблон. Вместо этого просто напишите
if (result == YourEnum.FOO.getValue()) {
...
} else if {
...
}
или
try {
val resultAsEnum = YourEnum.valueOf(result)
resultAsEnum match {
case YourEnum.FOO => ...
...
}
} catch {
case e: IllegalArgumentException => // didn't correspond to any value of YourEnum
}
Ответ 3
Вы получаете комментарий "метод". Таким образом, scala не оценивает вашу функцию. Он попытался вызвать метод unapply по методу.
Вы можете реализовать что-то вроде (в классе MyEnum):
public static MyEnum fromText(String text) {
for (MyEnum el : values()) {
if (el.getValue().equals(text)) {
return el;
}
}
return null;
}
И затем
MyEnum.fromText("foo") match{
case FOO => ..
}