我有我的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枚举上模式化匹配,但是不能在匹配的解构部分中调用方法。所以这有效:
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; }
}
您不能将方法调用结果用作模式。而是只写
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
}
您收到评论“方法”。因此,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 => ..
}
JMPL是简单的Java库,可以使用Java 8功能来模拟某些功能模式匹配。该库可以很好地使用枚举。