我想用以下java代码的Scala模拟实现:
static <T extends Enum> T getEnumByPrefix(String prefix, Class<T> enumClass) {
for (T enumValue : enumClass.getEnumConstants()) {
if (enumValue.name().startsWith(prefix)) {
return enumValue;
}
}
throw new NoSuchElementException();
}
但我无法想象如何为scala.Enumeration声明方法。
我试过
def enumByPrefix[T <: Enumeration](prefix: String): T.Value = ...
但这不会编译。
我试过
def enumByPrefix[T <: Enumeration.Value](columnLabel: String): T = ...
但这也不能编译。
基本上我想按如下方式使用它:
object PaymentMethod extends Enumeration {
val Insurance, Cash = Value
}
...
val paymentMethod: PaymentMethod.Value = enumByPrefix[PaymentMethod]("Insurance")
(我只使用了预览版,真实算法会有所不同)。
答案 0 :(得分:2)
scala> def enumByPrefix[T <: Enumeration](prefix: String, enum:T):Option[enum.Value] =
enum.values.find(_.toString.startsWith(prefix))
enumByPrefix: [T <: Enumeration](prefix: String, enum: T)Option[enum.Value]
将其与WeekDay
(已定义here)一起使用:
scala> enumByPrefix("Mon",WeekDay)
res2: Option[WeekDay.Value] = Some(Mon)
scala> enumByPrefix("Mon",WeekDay).map(isWorkingDay)
res3: Option[Boolean] = Some(true)