Вы можете избежать большого количества вложенных if
, просто изменив его на ?.let
и for
на 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
из Map
, содержащего сведения об организации. Если честно, я не смог придумать действительно изящный способ. Но лучше создать внешнюю функцию или что-то вроде этого, чтобы инкапсулировать запасную логику:
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% правильно, но я думаю, что смогу показать идею.