generics - 这个 Kotlin 转换代码可以简化吗?
问题描述
我们有一些返回“任何?”的第三方 SDK 代码。我们必须转换它(如果它转换并解析它)。因为我们的演员表是通用的,所以我无法弄清楚如何在不写 5 个演员表的情况下简化它。这在 Swift 中似乎要容易得多。有没有更好的方法来做这些演员?
private fun parseOrganizations(payload: Any?): List<UserOrganization> {
val organizations = mutableListOf<UserOrganization>()
payload?.let { userData ->
if (userData is Map<*, *>) {
val orgJsonList = userData["organizations"]
if (orgJsonList is List<*>) {
for (jsonMap in orgJsonList) {
if (jsonMap is Map<*, *>) {
val id = jsonMap["id"] as? String
val name = jsonMap["name"] as? String
val role = jsonMap["role"] as? String
val isActive = jsonMap["isActive"] as? Boolean
val isVerified = jsonMap["isVerified"] as? Boolean
if (id != null && name != null && role != null && isActive != null && isVerified != null) {
val org = UserOrganization(id, name, role, isActive, isVerified)
organizations.add(org)
}
}
}
}
}
}
return organizations
}
多谢你们。
解决方案
您可以避免大量嵌套if
,只需将其更改为?.let
和for
to map
。这种情况下的代码将是扁平且可读的
fun parseOrganizations(payload: Any?) {
payload
?.let { it as? Map<*, *> }
?.let { it["organizations"] as? List<*> }
?.mapNotNull { if (it is Map<*, *>) UserOrganization.fromMap(it) else null }
?.map { organizations.add(it) }
}
但是我们应该处理创建UserOrganization
from Map
contains 组织的详细信息。老实说,我想不出一个真正优雅的方式。但最好创建外部函数或类似的东西来封装回退逻辑:
class UserOrganization(
val id: String,
val name: String,
val role: String,
val isActive: Boolean,
val isVerified: Boolean
){
companion object {
fun fromMap(org: Map<*,*>): UserOrganization? =
if (org.keys.containsAll(listOf("id", "name", "role", "isActive", "isVerified"))) {
UserOrganization(
id = org["id"] as? String ?: "Unknown Id",
name = org["name"] as? String ?: "Unknown name",
role = org["role"] as? String ?: "Unknown role",
isActive = org["isActive"] as? Boolean ?: false,
isVerified = org["isVerified"] as? Boolean ?: false
)
} else null
}
}
我不能打赌它 100% 正确,但我想我可以展示这个想法。
推荐阅读
- javascript - Discord.js addRole() 函数有问题
- python - PyTeleBot / Schedule - 在特定时间发送消息
- typescript - React-Native 应用程序中的 ESLint / Prettier / Husky 缩进问题
- java - 接口内部和抽象类内部的getter
- javascript - 反应上下文重新渲染提供者的每个孩子?
- gcc - 使用 WSL 在 cmd.exe 上构建时的 vscode 问题匹配器问题
- macos - Mac png 截图中的未知块
- javascript - 如何访问 Form.control 的值?
- c# - 评级控件能否用于 Microsoft Store 评级?
- sql-server - 将 SAP hana 表复制到 Azure SQL 数据库并获取 SQL Server 找不到