与Java枚举值匹配的标量模式

问题描述 投票:10回答:4

我有我的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,所以我不太确定这是怎么回事,为什么我不能将其用于模式匹配?谢谢

java regex scala enums pattern-matching
4个回答
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
投票

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

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
}

1
投票

您收到评论“方法”。因此,scala不会评估您的功能。它试图取消对方法的调用。

您可以实现类似的东西(在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 => ..
}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.