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

Java 如何在Kotlin中维护这个复杂的if-else语句,java,if-statement,kotlin,simplify,Java,If Statement,Kotlin,Simplify,我编写了一个基于requestparams从数据库中获取信息的函数。下面的if-else语句是一个巨大的问题。如果我们继续添加更多的过滤器,我们需要继续为所有可能的路径添加语句 fun getMessages(name: String, pageable: Pageable, locale: String?, subject: String?, recipient: String?): Page<MessageDTO>

我编写了一个基于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(名称:String,可分页:可分页,区域设置:String?,主题:String?,
收件人:字符串?:页面?{
val messagePageable=if(!locale.isNullOrEmpty()&&!subject.isNullOrEmpty()&&!recipient.isNullOrEmpty()){
messageRepository.findAll(其中(hassessagename(name.))和(hasslocale(locale!!)
.和(hasubject(subject!!)。和(hasRecipient(recipient!!!))))),可分页
}如果(!locale.isNullOrEmpty()),则为else{
messageRepository.findAll(其中(hasMessageName(name).和(hasLocale(locale!!)),可分页)
}如果(!subject.isNullOrEmpty()),则为else{
messageRepository.findAll(其中(hassessagename(name.)和(hasSubject(subject!!)),可分页)
}否则{
messageRepository.findAll(其中(hasMessageName(name)),可分页)
}
返回messagePageable.map{messageMapper.toMessageDTO(it)}.takeIf{it.content.isNotEmpty()}
}

应该有更好的方法来写这个。非常感谢您的帮助。

您可以将
if
语句替换为更易于阅读的语句:

fun getMessages(名称:String,可分页:可分页,区域设置:String?,主题:String?,
收件人:字符串?:第页?=什么时候{
!locale.isNullOrEmpty()&&!subject.isNullOrEmpty()&&!recipient.isNullOrEmpty()->
messageRepository.findAll(其中(hassessagename(name.))和(hasslocale(locale!!)
.和(hasubject(subject!!)。和(hasRecipient(recipient!!!))))),可分页
!locale.isNullOrEmpty()->
messageRepository.findAll(其中(hasMessageName(name).和(hasLocale(locale!!)),可分页)
!subject.isNullOrEmpty()->
messageRepository.findAll(其中(hassessagename(name.)和(hasSubject(subject!!)),可分页)
其他->
messageRepository.findAll(其中(hasMessageName(name)),可分页)
}.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() }
}
fun getMessages(名称:String,可分页:可分页,区域设置:String?,主题:String?,
收件人:字符串?:页面?{
val请求=其中(hasMessageName(name))
语言环境?.let{request.and(hasLocale(it))}
subject?.let{request.and(hasSubject(it))}
收件人?.let{request.and(hasRecipient(it))}
return messageRepository.findAll(请求,可分页)
.map{messageMapper.toMessageDTO(it)}
.takeIf{it.content.isNotEmpty()}
}
在这里,我不确定
和()

request=request.and(…)

谢谢!这样好多了。locale?.let{request.and(haslocate(it))}只有当它不为null时,它才会执行haslocate,对吗?@J.Adam Correct;仅当值为非null时,才会调用内容。神奇之处在于
?。
运算符,它仅在前一个值不为null时调用以下方法。(这方面的
let()
方法没有什么特别之处;它只是为操作提供了一个方便的作用域。)谢谢!