2014-03-07 24 views
10

我有我的Java枚举,如:FOO("foo")BAR("bar") ... ,我有一个getValue()方法返回值"foo"和枚举的"bar",这必须是在Java中。Scala的模式匹配的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,所以我为什么不能使用它r模式匹配?谢谢

+0

如果这是一个枚举,为什么只是没有做的情况下对枚举值,而不是他们的“字符串表示”自己?否则,您总是可以创建一个“反向查找”方法,它将从其字符串表示形式 – fge

+0

返回枚举值,结果来自数据库,并且它是String类型并匹配enum的字符串rep。我想在这里匹配字符串值,所以我不认为反向查找会起作用,不是吗?你能告诉我一些例子吗?干杯 – Duc

+0

等一下。在你的Scala代码中,'match'是一个'String'。到现在为止还挺好。每个'病例'需要什么治疗?难道它不是在枚举本身的方法实现吗? – fge

回答

11

你可以在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; } 
} 
+0

我总是使用静态方法在enum中搜索值,感谢您寻找建议:) –

+0

感谢您的查找提示,这就是我一直在寻找 – Duc

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 
} 
1

您会收到评论 “方法”。因此,斯卡拉不会评估你的功能。它试图在方法上调用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 => .. 
}