[英]Scala pattern matching Java enum value
我有我的 java 枚舉,例如: FOO("foo")
, BAR("bar")
... 我有一個getValue()
方法來返回枚舉的值"foo"
和"bar"
,這必須在爪哇。
另一方面,我必須在 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 不會評估你的函數。 它試圖調用 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 => ..
}
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)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.