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 => ..
}