簡體   English   中英

Scala 模式匹配 Java 枚舉值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM