使用 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]
在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]