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

标签 java if-statement kotlin simplify

我编写了一个函数,根据 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() }
}

应该有更好的写法。感谢您的帮助。

最佳答案

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

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(...)

关于java - 如何使这个复杂的 if-else 语句在 Kotlin 中可维护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57308480/

相关文章:

java - 在数据库 Java Derby 中插入新数据时生成的 ID 错误

bash - bash 中的一行 if 语句

c++ - 程序忽略条件?

kotlin - 为什么 withContext 等待子协程的完成

gradle - 在以下任何来源中都找不到插件 [id : 'org.jetbrains.kotlin.jvm' , 版本: '1.2.71']

java - 在java应用程序中将单词映射到其同义词

java - Mapreduce 编程 : details required

java - 如何传递对抽象类的引用 - Java

if-statement - SCSS : using @if to include only certain selectors on compilation

Android Kotlin 使用 anko doAsync 在 ui 线程上处理异常