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

J. *_*dam 3 java if-statement simplify kotlin

我编写了一个函数,用于根据requestparams从数据库中获取信息。以下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() }
}
Run Code Online (Sandbox Code Playgroud)

应该有一个更好的书面方式。我感谢您的帮助。

Dem*_*god 5

我不确定,但是也许进行一些重构会有所帮助。例如,好像您正在使用某种形式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() }
}
Run Code Online (Sandbox Code Playgroud)

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