为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Kotlin 中维护这个复杂的 if-else 语句

如何在 Kotlin 中维护这个复杂的 if-else 语句

侃侃尔雅 2023-05-10 17:31:08
我写了一个函数来根据请求参数从数据库中获取信息。下面的 if-else 语句是一个大问题。如果我们继续添加更多过滤器,我们需要继续为所有可能的路径添加语句。    fun getMessages(name: String, pageable: Pageable, locale: String?, subject: String?,                              recipient: String?): Page<MessageDTO>? {        val messagePageable= if (!locale.isNullOrEmpty() && !subject.isNullOrEmpty() && !recipient.isNullOrEmpty()) {            messageRepository.findAll(where(hasMessageName(name).and(hasLocale(locale!!)            .and(hasSubject(subject!!).and(hasRecipient(recipient!!))))), pageable)        } else if (!locale.isNullOrEmpty()) {            messageRepository.findAll(where(hasMessageName(name).and(hasLocale(locale!!))), pageable)        } else if (!subject.isNullOrEmpty()) {            messageRepository.findAll(where(hasMessageName(name).and(hasSubject(subject!!))), pageable)        } else {            messageRepository.findAll(where(hasMessageName(name)), pageable)        }        return messagePageable.map { messageMapper.toMessageDTO(it) }.takeIf { it.content.isNotEmpty() }}应该有更好的写法。我感谢您的帮助。
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

我不确定,但也许一些重构会有所帮助。例如,您似乎正在对request数据库使用某种形式,如果根据参数进行填充,那么也许可以像这样进行管理。


fun getMessages(name: String, pageable: Pageable, locale: String?, subject: String?,

                          recipient: String?): Page<MessageDTO>? {

    val request = where(hasMessageName(name))

    locale?.let{ request.and(hasLocale(it)) }

    subject?.let{ request.and(hasSubject(it)) }

    recipient?.let{ request.and(hasRecipient(it))}


    return messageRepository.findAll(request, pageable)

                            .map { messageMapper.toMessageDTO(it) }

                            .takeIf { it.content.isNotEmpty() }

}

在这里,我不确定.and()方法是如何工作的,所以也许它应该是这样的: request = request.and(...)


查看完整回答
反对 回复 2023-05-10
?
慕容森

TA贡献1853条经验 获得超18个赞

您可以if用一个when语句替换您的语句,以便更容易阅读:

fun getMessages(name: String, pageable: Pageable, locale: String?, subject: String?,

                              recipient: String?): Page<MessageDTO>? = when {

    !locale.isNullOrEmpty() && !subject.isNullOrEmpty() && !recipient.isNullOrEmpty() ->

        messageRepository.findAll(where(hasMessageName(name).and(hasLocale(locale!!)

            .and(hasSubject(subject!!).and(hasRecipient(recipient!!))))), pageable)

    !locale.isNullOrEmpty() ->

        messageRepository.findAll(where(hasMessageName(name).and(hasLocale(locale!!))), pageable)

    !subject.isNullOrEmpty() ->

        messageRepository.findAll(where(hasMessageName(name).and(hasSubject(subject!!))), pageable)

    else ->

        messageRepository.findAll(where(hasMessageName(name)), pageable)

}.map { messageMapper.toMessageDTO(it) }.takeIf { it.content.isNotEmpty() }


查看完整回答
反对 回复 2023-05-10
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信