使用kotlin中的泛型函数将enum.values()转换为数组< string>

ndh0cuux  于 2021-08-25  发布在  Java
关注(0)|答案(3)|浏览(652)

在java中是这样的

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

如何将此代码更改为kotlin
谢谢Kotlin的新手

sbdsn5lh

sbdsn5lh1#

直译应该是:

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

这给了你一个机会 Array<String?> .
然而,我认为一个更为kotlin-y的方法是返回一个 List<String> ,因为这是内置的 Array.map 扩展函数返回。您还应该将其作为扩展函数/属性写入 KClass<out Enum<*>> ,而不是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
}
ma8fv8wu

ma8fv8wu2#

你可以用 enumValues<T>() 如使用枚举常量和中所示 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]
3duebb1j

3duebb1j3#

有关详细信息,请查阅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]

这个答案也可能有帮助。https://stackoverflow.com/a/44300496/4491971

相关问题