使用 Kotlin 中的泛型函数将 Enum.values() 转换为 Array<String>

Convert Enum.values() to Array<String> with a generic function in Kotlin

在Java中会是这样

public static String[] getNames(Class<? extends Enum<?>> e) {
    return Arrays.stream(e.getEnumConstants()).map(Enum::name).toArray(String[]::new);
}

如何将此代码更改为 Kotlin

谢谢... Kotlin 新手

查看 Kotlin 的官方文档以获取详细信息。

https://kotlinlang.org/docs/enum-classes.html

Kotlin enum 可以这样写:

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/java.util.-enumeration/to-list.html

这是一个使用现有 Java 枚举到 Kotlin 列表的示例。

val numbers = java.util.Hashtable<String, Int>()
numbers.put("one", 1)
numbers.put("two", 2)
numbers.put("three", 3)

// when you have an Enumeration from some old code
val enumeration: java.util.Enumeration<Int> = numbers.elements()

// you can convert it to list and transform further with list operations
val list = enumeration.toList().sorted()
println(list) // [1, 2, 3]

这个答案也可能有帮助。

直译为:

fun getNames(e: Class<out Enum<*>>) =
    Arrays.stream(e.enumConstants).map(Enum<*>::name).toArray<String>(::arrayOfNulls)

这给你一个Array<String?>

但是,我认为更 kotlin-y 的方法是 return a List<String>,因为这是内置的 Array.map 扩展函数 return秒。您还应该将其写为 KClass<out Enum<*>> 上的扩展 function/property,而不是 Java Class.

fun KClass<out Enum<*>>.enumConstantNames() =
    this.java.enumConstants.map(Enum<*>::name)
    // if you really want an Array<String> for some reason, you can add
    // .toTypedArray()
    // but I don't see any reason to

用法:

fun main(args: Array<String>) {
    println(Foo::class.enumConstantNames()) // [A, B, C]
}

enum class Foo {
    A, B, C
}

您可以使用enumValues<T>(),如Working with enum constants所示 和 map 名字。

enum class RGB { RED, GREEN, BLUE }

inline fun <reified T : Enum<T>> getNames() = enumValues<T>().map { it.name }

val namesList = getNames<RGB>() // [RED, GREEN, BLUE]