kotlin 从字符串到枚举的安全转换

2024-04-05

我需要将字符串转换为枚举值,但想要一个在字符串不是枚举时返回 null 的函数。

enum class Colors{
   Red, Green, Blue

} 

如果 testString 是值,我可以使用 Colors.valueOf(testString) ,但如果它无效,则会出现异常,在这种情况下我想要一个 null 。

因为我经常需要这样做,所以扩展功能将是理想的选择。但扩展需要对 Colors 类进行操作,而不是对 Colors 类型的对象进行操作。

有人知道如何编写这样的扩展吗?理想情况下,它对于任何枚举类都是通用的。

编写顶级函数很简单,但我正在寻找一个充当标准“方法”的函数

// instead of 
val willGetAnException = Colors.valueOf("Yellow") // standard existing fun
val willGetNull = Colors.valueOrNullOf("Orange")  // new fun i seek

理想情况下,它是通用的并且适用于任何枚举


您不需要扩展,因为必须在现有对象上调用它们。您想要一个顶级函数。有一个内置的您可以使用:

/**
 * Returns an enum entry with specified name.
 */
@SinceKotlin("1.1")
public inline fun <reified T : Enum<T>> enumValueOf(name: String): T

您可以通过推断类型来调用它,或者显式地调用它:

val a : MyEnumClass = enumValueOf("A")
val b = enumValueOf<MyEnumClass>("B")

然而这个方法不能为空:它会抛出异常java.lang.IllegalArgumentException对未知值。

但很容易模仿它的行为并让它适用于具有顶级函数的可为空枚举:

inline fun <reified T : Enum<*>> enumValueOrNull(name: String): T? =
    T::class.java.enumConstants.firstOrNull { it.name == name }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kotlin 从字符串到枚举的安全转换 的相关文章

  • groovy 无法解析 kotlin 类

    由于我无法解决我遇到的问题kotlin 我决定回到groovy为了实现该插件 但是我遇到了这个问题 我有这样的项目结构 为了不重写所有类 我决定重用中实现的类kotlin 然而我的课FileProcessingCoreGroovy Down
  • 如何让枚举存储每个条目的额外信息

    我有一组包含相关信息的项目 这些项目是由我 程序员 定义的 用户不需要更改它们 它们永远不需要根据配置进行更改 并且它们唯一可能更改的时间是在我的应用程序的未来版本中 我事先知道这些项目应该有多少 以及它们的确切数据是什么 枚举是一种很棒的
  • 从成员函数返回枚举

    我想实现返回枚举的函数 class myClass private res res public enum res ok fail res getRes bool checkRes res r other function that cha
  • 尝试使用资源/使用/多个资源

    我使用的 Java API 大量使用了 Autoclosable Interface 因此在 Java try with resources 中 然而在Java中你可以指定 try res1 res2 res3 我们有办法使用多种资源吗 它
  • 如何在发布版本中使用 Zebra EMDK?

    所以我有一台 Zebra MC330M 设备 我之前创建了一个应用程序 我想使用 PDA 内置的条形码扫描仪 如果在调试模式下运行我的应用程序 一切正常 我可以读取条形码 但是如果我创建暂存或释放版本 apk 则条形码读取器不活动 因此如果
  • 一种在 C++0x 枚举类中使用所有非限定名称的方法? [复制]

    这个问题在这里已经有答案了 新的 C C 0x 或 C 11 具有一种新类型的枚举 即 枚举类 其中名称的作用域为枚举 除其他外 enum class E VAL1 VAL2 void fun E e E VAL1 Qualified na
  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • 如何将计算值转换为文字以进行枚举初始化

    我遇到了枚举的问题 因为我想将 case 初始化为双精度值PI 180 有没有办法通过常量或一些时髦的魔法获取这个计算值并将其转换为文字 以便我可以初始化枚举 我宁愿不必做3 14 我宁愿使用该值的实际编译器和硬件计算表示 所以我的第一次尝
  • Kotlin 中是否有类似于 #region #endregion 的语法?

    我知道我可以使用 region endregion 包围 C 中的代码片段 Kotlin 中是否有类似的语法 谢谢 region MyRegion protected void Page Load object sender EventAr
  • Android:如何根据视图模型实时数据属性为片段编写单元测试?

    我的片段 UI 中有一个列表视图 其元素集取决于来自视图模型 LiveData 属性的值的状态 我想为片段创建工具测试 该片段包含与该属性的值集相关的 3 个场景测试用例 但我不知道从哪里开始 我的代码应该如下所示 class MyView
  • Kotlin:覆盖子类型中的通用属性

    我试图编写一些通用代码 但无法摆脱Type of PROPERTY is not a subtype of the overridden property error 我的代码的简化版本 abstract class BaseP
  • Kotlin JavaScript 到 TypeScript 定义文件

    我已经找到了ts2kt 库 https github com Kotlin ts2kt这将从任意位置创建 Kotlin 头文件 d ts文件 但是 我想朝相反的方向走 我想构建一个可以编译为 JavaScript 的 Kotlin 库 但我
  • Kotlin 中的单例类

    我想知道如何在 Kotlin 中创建一个单例类 以便我的 Util 类在每次应用程序执行时仅实例化一次 但是 当我将 Java 类转换为 kotlin 时 生成了以下代码 它是否正确 companion object private var
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • 如何获取在代码中 attrs.xml 中创建的枚举

    我创建了一个自定义视图 找到它here https bitbucket org informatic0re awesome font iconview 具有枚举类型的可声明样式属性 在 xml 中 我现在可以为我的自定义属性选择枚举条目之一
  • Jetpack 中的波浪框组成

    有没有办法用Canvas制作一个顶部有波浪形的盒子 我想知道这个效果是否可以直接用Canvas来实现 不需要有滚动动画 不太清楚你为什么在谈论Canvas 要裁剪这样的视图 您可以使用自定义Shape并将其应用到您的视图中Modifier
  • Jetpack Compose:制作全屏(绝对定位)组件

    我怎样才能在全屏渲染树的深处制作一个可组合的 类似于Dialog可组合作品 例如 当用户单击图像时 它会显示该图像的全屏预览 而无需更改当前路线 我可以用 CSS 来做到这一点position absolute or position fi
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 为什么我们在 Kotlin 中使用“伴生对象”来替代 Java 静态字段?

    伴生对象 的本意是什么 到目前为止我一直用它来代替Java的static当我需要它的时候 我很困惑 为什么叫 同伴 呢 这是否意味着要创建多个static属性 我必须将其分组在里面companion object block 为了立即创建一
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi

随机推荐

  • 选择选项中的删除线文本

    我试图删除选择选项中的文本 但由于某种原因它不起作用 Fiddler https jsfiddle net 99x50s2s 95 https jsfiddle net 99x50s2s 95 HTML
  • NSURLSessionTask 身份验证质询完成处理程序和 NSURLAuthenticationChallenge 客户端

    我正在实施一个自定义NSURLProtocol 并且内部想要使用NSURLSession与内部网络的数据任务而不是NSURLConnection 我遇到了一个有趣的问题 想知道挑战处理程序的内部实现NSURLSession NSURLSes
  • 使用 XML 差异和合并进行版本控制

    我正在寻找一个开源版本控制工具 可以比较和合并 XML 文件 我必须找到这样一个工具的困难在于 我需要正确合并比较节点而不是行的 XML 文件 任何想法 谢谢 不幸的是 对于这个问题没有一刀切的解决方案 XML 比较对于您认为不同的内容非常
  • 为什么 C# Parallel.Invoke 很慢?

    我正在这样做 private static void Main string args var dict1 new Dictionary
  • 带有每个项目的详细信息行的 Gridview

    我是 ASP NET 新手 我有一个基本的工作网格视图 列出了公司名称 参见下面的代码 我想要做的是在每个公司下提供另一个联系人子列表 在 子列表 中缩进一点 我想以某种方式循环遍历 Gridview 数据 然后运行联系人查询 将是 Sel
  • React、Webpack 应用程序中重叠 CSS

    我使用 webpack 和 Reactjs 创建了一个应用程序 到目前为止我已经创建了 2 个页面 我已经为这两个页面定义了 CSS 样式 但是 当我在加载页面 1 后加载页面 2 时 页面 1 的样式会干扰页面 2 的样式 例如 Page
  • 绘制指数或分位数色带在零附近发散的栅格

    我正在使用 R 函数levelplot 来自rasterVis包来绘制具有单个发散色带的三个栅格的堆栈 我想更改栅格颜色渐变的比例 以便地图突出较低值的差异 这可以通过颜色中断的非线性分级来完成 我正在使用来自的代码a gist https
  • Orderer有区块(账本)数据吗?

    我使用基于 Kafka 的订购服务构建了超级账本结构网络 我以为Orderer没有Block数据 但是 当我检查 Orderer 服务器中的 var hyperledger product orderer chains mychannel
  • 无法加载为扩展“[extensionHere]”注册的类型[nameHere]

    我一直在 fx3 5 上使用 WCF 学习和构建 JSONP Web 服务 你可以阅读我在以下网站进行的一些试验 NET ASMX 返回纯 JSON https stackoverflow com questions 1903022 net
  • 为什么 pygame 上两个移动物体之间的碰撞不起作用?

    我正在用 pygame 做一个蛇游戏 游戏中有两条蛇 我想检测蛇头何时与另一条蛇身体碰撞 对两者都执行此操作 以及当两个头碰撞时的特殊情况 我目前正在做蛇头和另一条蛇身体之间的碰撞 如果其中一条蛇被冻结而另一条蛇在移动 则碰撞效果很好 但如
  • 如何在代码中定义DataTemplate?

    我怎样才能创建一个DataTemplate在代码中 使用 C 然后向其中添加一个控件DataTemplate
  • 当我的项目有同名模块时,如何从标准库导入? (如何控制 Python 寻找模块的位置?)

    我的项目文件夹中有一个名为calendar 在代码的其他地方 我想使用标准库Calendar班级 但是当我尝试导入此类时 使用from calendar import Calendar 这会从我自己的模块导入 从而导致稍后出现错误 我怎样才
  • PHP IMAP 交换问题

    所以我目前正在编写的 PHP 脚本有一个小问题 首先 我假设该脚本应该连接到 IMAP 邮箱 搜索一些电子邮件并下载其附件 所有这些都已经编码并正在使用我自己的 Gmail 帐户 当我尝试连接到交换服务器时出现问题 短代码摘录 mbox i
  • “自动测试/rails [...]不[...]存在。正在中止”

    我发现自动测试已停止工作 autotest loading autotest rails Autotest style autotest rails doesn t seem to exist Aborting 根据这篇博文 http ww
  • 一次保存多个 Backbone 模型

    我有一个包含大量模型的 Backbone 集合 每当在模型上设置特定属性并保存它时 就会触发大量计算并重新渲染 UI 但是 我希望能够同时在多个模型上设置属性 并且只有在全部设置完毕后才进行保存和重新渲染 当然 我不想为一项操作发出多个 h
  • Angularjs:无法将类添加到ID

    这里有点情况 我刚刚学习 Angular 但遇到了以下问题 我有一个重复自身的列表 ng repeat 当它被渲染时 您可以单击它 然后我将一个类添加到您单击的列表项中 jQuery 风格 id addClass myClass id 存储
  • 如何在php中打印多维数组

    我有一个以下格式的数组 Array 0 gt Array product id gt 33 amount gt 1 1 gt Array product id gt 34 amount gt 3 2 gt Array product id
  • 从 google firebase 存储本地缓存图像

    我正在寻找一种方法 从 google firebase 平台上的存储中缓存图像 目前 我可以下载图像并向用户显示这些图像 但即使没有互联网连接 我也无法缓存和访问该图像 数据库可以离线访问 所以我想 也应该有一种存储方式 我不想将每个图像下
  • 锁定计算机或启动另一个实例时 Visual Studio 崩溃

    当我锁定计算机或启动另一个 Visual Studio 实例时 我遇到了 Visual Studio 2013 崩溃的问题 我使用应用了最新补丁的 Visual Studio 2013 我总是以管理员身份启动 Visual Studio 这
  • kotlin 从字符串到枚举的安全转换

    我需要将字符串转换为枚举值 但想要一个在字符串不是枚举时返回 null 的函数 enum class Colors Red Green Blue 如果 testString 是值 我可以使用 Colors valueOf testStrin