2014-03-07 2 views
10

Ich habe meine Java-Enumeration wie: FOO("foo"), BAR("bar") ... und ich habe eine getValue() Methode den Wert "foo" und "bar" der Enumeration zurück, und dies hat in Java sein.Scala Pattern-Matching-Java Enum-Wert

Auf der anderen Seite, ich habe dies in Scala entsprechen:

result match { 
    case "foo" => 

ich zu tun versucht:

result match { 
    case Enum.FOO.getValue() => 

ich diesen Fehler:

method getValue is not a case class constructor, nor does it have an 
unapply/unapplySeq method 

I bin mir nicht ganz sicher, was hier passiert, seit meine getValue() methode eine String zurückgibt, also warum ich sie nicht benutzen kann r Mustererkennung? Danke

+0

Wenn dies eine Enumeration ist, warum nur den Fall auf der ENUM nicht Werte selbst statt ihrer „String-Darstellung“ ? Andernfalls könnten Sie immer eine "Reverse-Lookup" -Methode erstellen, die den enum-Wert aus der Zeichenfolgendarstellung zurückgibt. – fge

+0

Das Ergebnis stammt von der DB und ist vom Typ String und entspricht der Zeichenfolge rep des Enums. Ich versuche, den String-Wert hier zu finden, also glaube ich nicht, dass ein Reverse-Lookup funktionieren würde, oder? Kannst du mir bitte ein Beispiel zeigen? Prost – Duc

+0

Halten Sie an.In Ihrem Scala-Code ist 'match' ein' String'. So weit, ist es gut. Welche Behandlung wird in jedem Fall benötigt? Kann es nicht eine Methodenimplementierung im Enum selbst sein? – fge

Antwort

11

Sie können Mustererkennung auf Java Aufzählungen, aber man kann nicht Aufruf Methoden in der Destrukturierung Teil des Spiels. So funktioniert das:

j match { case Jenum.FOO => "yay"; case _ => "boo" } 

wenn j eine Instanz des Java Enum ist (geschickt Jenum markiert).

Sie können jedoch etwas tun:

"foo" match { 
    case s if s == Jenum.FOO.getValue => "yay" 
    case _       => "boo" 
} 

Oder Sie können Ihre Zeichenfolge an den ENUM zuerst konvertieren:

Jenum.values.find(_.getValue == "foo") match { 
    case Some(Jenum.FOO) => "yay" 
    case _    => "boo" 
} 

(Sie können auch zuerst zu vermeiden, dass die Option auspacken wollen Wiederholung Some(...) so oft).

als Referenz, dann ist dies der Test ENUM I verwendet (Jenum.java):

public enum Jenum { 
    FOO("foo"), BAR("bar"); 

    private final String value; 
    Jenum(String value) { this.value = value; } 

    public String getValue() { return value; } 
} 
+0

Ich habe immer statische Methode verwendet, um Wert in Enum zu suchen, danke für Vorschlag zu finden :) –

+0

danke für die Fundtipps, das ist was ich habe gesucht – Duc

1

Sie können ein Methodenaufrufergebnis nicht als Muster verwenden. Stattdessen schreiben Sie einfach

if (result == YourEnum.FOO.getValue()) { 
    ... 
} else if { 
    ... 
} 

oder

try { 
    val resultAsEnum = YourEnum.valueOf(result) 

    resultAsEnum match { 
    case YourEnum.FOO => ... 
    ... 
    } 
} catch { 
    case e: IllegalArgumentException => // didn't correspond to any value of YourEnum 
} 
1

Sie den Kommentar "Methode" erhalten. Scala evaluiert also nicht deine Funktion. Es versuchte, die Methode nicht anzuwenden.

Sie können so etwas wie (in MyEnum Klasse) implementieren:

public static MyEnum fromText(String text) { 
     for (MyEnum el : values()) { 
      if (el.getValue().equals(text)) { 
       return el; 
      } 
     } 
     return null; 
    } 

Und dann

MyEnum.fromText("foo") match{ 
case FOO => .. 
}