如果我有一个这样的enum:
public enum Letter {
A,
B,
C,
//...
}
随机挑选一个的最佳方法是什么?它不需要是生产质量的防弹,但一个相当均匀的分布会很好。
我可以这样做
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
但是有没有更好的办法呢?我觉得这个问题之前已经解决了。
简单的Kotlin解决方案
MyEnum.values().random()
random()是Collection对象上包含在基本Kotlin中的默认扩展函数。Kotlin文档链接
如果你想用扩展函数来简化它,试试这个:
inline fun <reified T : Enum<T>> random(): T = enumValues<T>().random()
// Then call
random<MyEnum>()
使它在枚举类上是静态的。确保在枚举文件中导入my.package.random
MyEnum.randomValue()
// Add this to your enum class
companion object {
fun randomValue(): MyEnum {
return random()
}
}
如果您需要从枚举的实例执行此操作,请尝试此扩展
inline fun <reified T : Enum<T>> T.random() = enumValues<T>().random()
// Then call
MyEnum.VALUE.random() // or myEnumVal.random()
简单的Kotlin解决方案
MyEnum.values().random()
random()是Collection对象上包含在基本Kotlin中的默认扩展函数。Kotlin文档链接
如果你想用扩展函数来简化它,试试这个:
inline fun <reified T : Enum<T>> random(): T = enumValues<T>().random()
// Then call
random<MyEnum>()
使它在枚举类上是静态的。确保在枚举文件中导入my.package.random
MyEnum.randomValue()
// Add this to your enum class
companion object {
fun randomValue(): MyEnum {
return random()
}
}
如果您需要从枚举的实例执行此操作,请尝试此扩展
inline fun <reified T : Enum<T>> T.random() = enumValues<T>().random()
// Then call
MyEnum.VALUE.random() // or myEnumVal.random()