当前位置: 首页 > 知识库问答 >
问题:

使用一个值初始化Scala枚举值集的简写

云联
2023-03-14

所以我有一个Scala枚举对象:

object KnotType extends Enumeration {
        type KnotType = Value
    val STOPPER, HITCH, ENDLOOP, MIDLOOP, ADJUSTABLELOOP, BEND, BINDING = Value
  }
  import KnotType._

  object AnotherType extends Enumeration {
        ...      }
  import AnotherType ._

我想初始化一个新的ValueSet实例,仅存在一个值。用最短的速记:

val eKnots = STOPPER + HITCH
eKnot: KnotType.ValueSet = KnotType.ValueSet(STOPPER , HITCH)

很有魅力。然而,要从一个值创建一个值集,我必须更加明确:(尤其是在枚举对象类上有多个)

从一个值创建枚举会产生一个值(如预期的那样),但不是我想要的(一个值集):

val eKnot = STOPPER
eKnot: KnotType.Value = STOPPER

常规方法是:

val eKnot =  KnotType.ValueSet(STOPPER)
eKnot: KnotType.ValueSet = KnotType.ValueSet(STOPPER)

不雅观的方式:

val eKnot = STOPPER + STOPPER
eKnot: KnotType.ValueSet = KnotType.ValueSet(STOPPER)

冗长的方法——工作正常,但我追求简洁

val eKnot = KnotType.ValueSet.empty + STOPPER
eKnot: KnotType.ValueSet = KnotType.ValueSet(STOPPER)

我还能用其他速记法吗?i、 e val eKnot=塞子/一些简单的东西/

共有1个答案

漆雕彦
2023-03-14

您可以创建自己的扩展方法(类似于JavaConverters):

implicit class ValueToValueSet(v: Value) {
  def toSet: ValueSet = ValueSet(v)
}

val eKnot: KnotType.ValueSet = STOPPER.toSet

或隐式转换(我认为这与JavaConversions类似,因此不推荐):

implicit def valueToValueSet(v: Value): ValueSet = ValueSet(v)

val eKnot: KnotType.ValueSet = STOPPER
 类似资料:
  • 问题内容: 假设我有一个枚举,然后实例化一个天数组。 如何将一天(例如)设置为所有“天”的默认值?如果如上所述进行设置,则所有元素均为空。我希望通过枚举表现得更像ints和Strings,它们分别初始化为0和“”。 问题答案: 正如其他人所说,枚举是引用类型-它们只是特定类的编译器语法糖。JVM不了解它们。这意味着该类型的默认值为null。当然,这不仅会影响数组- 这意味着类型为枚举的任何字段的初

  • 我正在尝试从整数值反序列化scala枚举。 当我尝试反序列化这个字段时,它会抛出一个错误-的值com.example.TestEnum$JsonToken.VALUE_NUMBER_INT 我看到jackson doc建议在java中使用JsonCreator,但是没有提到scala enum。 我使用默认的ScalaMapper没有任何定制在这里。

  • 假设我有这样的枚举 我也有一个类,我想扩展有序[SimpleEnum] 所以在SimpleClass中,我只需要获取附加到相应SimpleEnum val的值。 在java中,我能够声明一个变量的枚举和访问一个实际的值对应于它的这个var,在scala我正在寻找一种方法来获取枚举的实例,并接触到它的值。

  • 问题内容: 我有几个需要国际化的枚举(我需要将枚举值转换为某些语言才能在jsf页面中显示)。考试列举: 翻译将是例如/ 转换应存储在MessageBundle(属性文件)中。我正在寻找一个简单,通用的解决方案(最好是无需在所有枚举中编写额外的代码),而该解决方案在jsf方面并不需要太多。仅提及它,当然,两个不同的枚举可能具有相同的枚举值(例如,类似的值在不同的枚举中具有不同的含义)。 我想出的解决

  • 据我所知,在Java11中,这两个操作可以在一行中完成,不是吗?