如何检查JSON中字符串type.name是否存在于指定枚举集合中?
问题
我定义了如下Kotlin枚举类:
enum class MimeType(val value: String, val priority: Int) { PNG("PNG", 1), GZIP("GZIP", 2), TEXT("TEXT", 3), Unknown("null", Int.MIN_VALUE) }
并创建了该枚举的集合:
val mimeTypeSet = setOf(MimeType.PNG, MimeType.GZIP)
此外有一个JSON对象,其中包含types数组,数组内每个对象都有"name"标识符:
"documentProfile": { "types": [{ "name": "png", "title": "Picture1", "description": "Picture of animal", "hash": "fedac987343" }, { "name": "gzip", "title": "file1", "description": "document of ra", "hash": "8a73f43edc" }] }
我通过如下代码遍历types数组:
documentProfile.types.forEach{ type -> type.name // 遍历得到png、gzip等字符串 }
请问如何判断字符串类型的type.name(如"png")是否存在于mimeTypeSet枚举集合中?
解决方案
方法1:预转字符串集合快速判断
先把mimeTypeSet里的枚举值的value转成小写(匹配JSON中name的小写格式),生成一个字符串集合,后续直接用contains判断,效率更高:
// 预先生成小写的允许类型集合 val allowedMimeNames = mimeTypeSet.map { it.value.lowercase() }.toSet() // 遍历判断 documentProfile.types.forEach { type -> val isExists = allowedMimeNames.contains(type.name.lowercase()) // 这里可根据需求处理判断结果,比如打印或业务逻辑处理 println("${type.name} 是否在集合中:$isExists") }
这种方法适合需要多次判断的场景,仅需一次转换,后续判断为O(1)时间复杂度。
方法2:通过枚举匹配判断
直接尝试将type.name转换为枚举实例,再判断是否在mimeTypeSet中,同时处理转换失败的情况:
documentProfile.types.forEach { type -> val isExists = runCatching { MimeType.valueOf(type.name.uppercase()) }.getOrElse { MimeType.Unknown } in mimeTypeSet println("${type.name} 是否在集合中:$isExists") }
这里用runCatching捕获转换异常,失败时返回Unknown枚举,再判断该实例是否在目标集合内。
方法3:遍历枚举集合匹配
直接遍历mimeTypeSet,逐个匹配枚举value的小写与type.name的小写:
documentProfile.types.forEach { type -> val targetName = type.name.lowercase() val isExists = mimeTypeSet.any { it.value.lowercase() == targetName } println("${type.name} 是否在集合中:$isExists") }
这种方法无需预存集合,但每次判断都要遍历枚举集合,适合集合规模较小的场景。
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

