Convertir object con campos anulables en un object con campos que no admiten nulos o nulo
Tengo un object devuelto por una API, que tiene diferentes campos anulables. Quiero crear otro object con campos no anulables o devolver nulo si no es posible. ¿Cuál es la expresión idiomática que mejor se adapta a ese escenario? Actualmente estoy usando ?.let {}
y se ve bastante feo:
fun convertAnswer(userAnswer: AnswerGson, answerResponse: AnswerResponseGson, correctAnswerText: String): AnswerResponseUi? { return userAnswer.id?.let { userAnswerId -> userAnswer.text?.let { userAnswerText -> answerResponse.answer?.id?.let { correctAnswerId -> answerResponse.points?.let { points -> answerResponse.discount?.let { discount -> answerResponse.booster?.let { booster -> return AnswerResponseUi(userAnswerId, correctAnswerId, userAnswerText, correctAnswerText, points, discount, booster.name ?: "") } } } } } } }
- ¿Cómo declaro un parámetro de function para aceptar funciones que arrojan?
- Kotlin Generics tipo personalizado con comodín
- No se puede comprimir Rxjava Observables
- ¿Cómo se transfiere el valor de db en Kotlin?
- ¿Cómo verificar que la image haya cambiado si no hay cambios en el código HTML?
- No puedo entender la implementación del código fuente de string.kt en kotlin
- Kotlin || El elemento Recycleview no está inflando: código inalcanzable en cada método reemplazado de RecycleView.Adapter
- Kotlin addTextChangeListener lambda?
- La function en línea no puede acceder a API no pública: @PublishedApi vs @Suppress vs @JvmSynthetic
- Error de falta de coincidencia del tipo Kotlin al pasar los arguments desde la terminal
- Parece ser un error en la biblioteca de layout de soporte
- Pasando 'esto' a un Constructor
- se bloqueó cuando intenté usar la intención de enviar un correo electrónico (Kotlin)
Si sus classs AnswerGson
y AnswerResponseGson
tienen sus properties declaradas como val
, puede convertir su código a algo como esto:
fun convertAnswer(userAnswer: AnswerGson, answerResponse: AnswerResponseGson, correctAnswerText: String): AnswerResponseUi? { if (userAnswer.id == null || userAnswer.text == null || answerResponse.discount == null || answerResponse.points == null || answerResponse.booster == null || answerResponse.answer == null || answerResponse.answer.id == null ) return null return AnswerResponseUi(userAnswer.id, answerResponse.answer.id, userAnswer.text, correctAnswerText, answerResponse.points, answerResponse.discount, answerResponse.booster.name ?: "") }
Este ejemplo usa moldes inteligentes : el comstackdor analiza el flujo de control y testing que si se alcanza la última instrucción, ninguno de los valores marcados arriba es null
.
Estas verificaciones no se aplican a las cadenas de desreference seguras, y tuve que verificar primero answerResponse.answer
y solo luego answerResponse.answer.id
.
Si tiene properties de var
, no se pueden aplicar moldes inteligentes porque el valor puede cambiar después de que se marque.
En este caso, puede networkingucir la anidación en su código extrayendo los valores en variables locales y verificándolos al mismo time:
fun convertAnswer(userAnswer: AnswerGson, answerResponse: AnswerResponseGson, correctAnswerText: String): AnswerResponseUi? { val answerId = userAnswer.id ?: return null val correctAnswerId = answerResponse.answer?.id ?: return null val userAnswerText = userAnswer.text ?: return null val points = answerResponse.points ?: return null val discount = answerResponse.discount ?: return null val booster = answerResponse.booster ?: return null return AnswerResponseUi(answerId, correctAnswerId, userAnswerText, correctAnswerText, points, discount, booster.name ?: "") }
Y, como @mfulton26 notó, incluso puedes alinear estas variables (también funciona para val
s):
fun convertAnswer(userAnswer: AnswerGson, answerResponse: AnswerResponseGson, correctAnswerText: String): AnswerResponseUi? { return AnswerResponseUi(userAnswer.id ?: return null, answerResponse.answer?.id ?: return null, userAnswer.text ?: return null, correctAnswerText, answerResponse.points ?: return null, answerResponse.discount ?: return null, (answerResponse.booster ?: return null).name ?: "") }
- no puede generar carpetas de vista java.lang.IndexOutOfBoundsException
- Modificar "esto" en la function de extensión