首页 > 解决方案 > 如何在 Optional 中将两种类型应用于 orElse()

问题描述

我想在Optional中使用orElse()函数,但前半部分“engineRepository.findById(engineId)”返回模型,后半部分返回模型列表,如何让结果返回列表?

我尝试将 listof() 添加到前半部分,但我不能再使用 orElse() 了,该怎么做?

var ModelList: List<Model> = try {
            EngineRepository.findById(engineId).orElse(EngineRepository.findAllByEnvironment(environment)))

}
@Repository
interface EngineRepository : MongoRepository<Model, String> {
    fun findAllByEnvironment(environment: String):List<Model>
}

标签: kotlin

解决方案


您确实应该使用listOf,但不应将整个表达式传递EngineRepository.findById(engineId)给它,而应将其应用于被返回的Model包装内。为此,请使用:OptionalfindByIdmap

EngineRepository.findById(engineId)
    .map(::listOf)
    .orElse(EngineRepository.findAllByEnvironment(environment))

请注意,findAllByEnvironment无论是否findById返回Optional.empty(). 如果你不想这样,你应该使用orElseGet

.orElseGet { EngineRepository.findAllByEnvironment(environment) }

推荐阅读