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