【问题标题】:Iterate enum values using values() and valueOf in kotlin在 kotlin 中使用 values() 和 valueOf 迭代枚举值
【发布时间】:2017-06-01 06:50:01
【问题描述】:

我是这里的新手。谁能举个例子用 values 和 valueOf 方法迭代枚举?

这是我的枚举类

enum class Gender {
    Female,
    Male
}

我知道我们可以得到这样的值

Gender.Female

但我想迭代并显示 Gender 的所有值。我们怎样才能做到这一点?任何帮助将不胜感激

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    你可以像这样使用values

    val genders = Gender.values()
    

    从 Kotlin 1.1 开始,还提供了一些辅助方法:

    val genders = enumValues<Gender>()
    

    通过以上你可以轻松地遍历所有值:

    enumValues<Gender>().forEach { println(it.name) }
    

    要将枚举名称映射到枚举值,请使用 valueOf/enumValueOf,如下所示:

     val male = Gender.valueOf("Male")
     val female = enumValueOf<Gender>("Female")     
    

    【讨论】:

    • 迭代的顺序是什么(按name的abc,或ordinal,...)?这种方法稳定吗(如果枚举顺序和项目不变,迭代顺序不会改变)?
    • 参见this Kotlin issue,旨在用更现代、更高效的替代方案取代Enum.values()
    【解决方案2】:

    您将得到[LGender;@2f0e140b 或与打印Gender.values() 类似的输出,因为您正在打印数组引用本身,并且数组没有像列表那样好的默认toString 实现。

    打印所有值的最简单方法是遍历该数组,如下所示:

    Gender.values().forEach { println(it) }
    

    或者如果你喜欢方法参考:

    Gender.values().forEach(::println)
    

    您还可以使用标准库中的joinToString 来显示单个格式化字符串中的所有值(它甚至具有前缀、后缀、分隔符等选项):

    println(Gender.values().joinToString()) // Female, Male
    

    【讨论】:

      【解决方案3】:

      您可以将此方法添加到您的枚举类中。

      fun getList(): List<String> {
          return values().map {
              it.toString()
          }
      }
      

      然后调用

      val genders = Gender.getList()
      // genders is now a List of string
      // Female, Male
      

      【讨论】:

        【解决方案4】:

        您可以这样做并获得一个新的枚举类型数组Gender

        val arr = enumValues<Gender>()
        

        如果你想要它的列表,你可以使用扩展。 toList()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-28
          • 1970-01-01
          • 2018-02-21
          相关资源
          最近更新 更多