Scala模式匹配Java枚举值

时间:2014-03-07 10:51:34

标签: java regex scala enums pattern-matching

我有我的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所以为什么我不能用它进行模式匹配?感谢

4 个答案:

答案 0 :(得分:13)

您可以在Java枚举上进行模式匹配,但无法调用匹配的解构部分中的方法。所以这有效:

j match { case Jenum.FOO => "yay"; case _ => "boo" }

如果j是您的Java枚举实例(巧妙地标记为Jenum)。

你可以这样做:

"foo" match {
  case s if s == Jenum.FOO.getValue => "yay"
  case _                            => "boo"
}

或者您可以先将字符串转换为枚举:

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; }
}

答案 1 :(得分:1)

您不能将方法调用结果用作模式。而只是写

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
}

答案 2 :(得分:1)

您收到评论“方法”。因此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 => ..
}

答案 3 :(得分:0)

JMPL是一个简单的Java库,可以使用Java 8功能来模拟某些功能模式匹配。该库可以很好地使用枚举。

   matches(myEnum).as(
      MyEnum.FOO,  () ->  System.out.println("FOO value");
      MyEnum.BAR,  () ->  System.out.println("BAR VALUE");
      Else.class,  () ->  System.out.println("Default value: " + data)
   );