В Java это было бы так

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

Как я могу изменить этот код на Kotlin

Спасибо ... Новичок в Котлине

0
Emmanuel Conradie 7 Июл 2021 в 11:00

3 ответа

Лучший ответ

Дословный перевод был бы таким:

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

Это дает вам Array<String?>.

Однако я думаю, что более простой способ сделать это - вернуть 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
}
2
Sweeper 7 Июл 2021 в 08:25

Ознакомьтесь с этой официальной документацией Kotlin для получения подробной информации.

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

Перечисление Котлина можно записать следующим образом:

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

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

Это пример использования существующего списка Java Enum to 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

0
Mohit Ajwani 7 Июл 2021 в 08:16

Вы можете использовать enumValues<T>(), как показано в [Работа с константами перечисления] [1] и 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]
0
Ben Shmuel 7 Июл 2021 в 09:55