如果不存在,单声道继续

Mono continue if not present

给定两个会话(A 和 B)作为字符串,我的目标是检查 A 在数据库中是否有效。如果 A 存在,则 return 它。如果没有提供A(或数据库中不存在),我想继续检查数据库中的会话B。

我下面的代码的问题是我 return 不管是否找到 A。相反,我想检查如果找不到 A(为空),则继续检查 B。有没有办法检查 Mono 是否 not 存在?

String sessionA = "1";
String sessionB = "2";


public Mono<Session> getSession() {
    if (!StringUtils.isEmpty(sessionA)) {
        return myDatabaseService.findByKeyOne(sessionA); // Should only return if it exists, otherwise, check session B
    }

    if (!StringUtils.isEmpty(sessionB)) {
        return myDatabaseService.findByAnotherSession(sessionB);
    }

    throw new Exception(); // If both sessions have not been found
}


// My Database Service (dummy code)
public Mono<Session> findByKeyOne(String session) {
    try {
        return myDatabase.find(); 
    } catch (Exception e) { 
        return Mono.empty() // If an error occurrd or no result has been found, return empty
    }
}

尝试Mono#switchIfEmpty

这很简单:

myDatabaseService.findByKeyOne(sessionA)
    .switchIfEmpty(myDatabaseService.findByAnotherSession(sessionB))

现在您只需检查您的可空性

扩展@Eugene Botyanovsky 的回答,解决可选的 sessionA,您可以尝试这样的事情:

// Return an exception in case both sessionA and sessionB are empty.
if (StringUtils.isEmpty(sessionA) && StringUtils.isEmpty(sessionB)) {
  return Mono.error(new Exception());
}

// simply return an empty Mono if sessionA is empty.
Mono<Session> sessionAMono = StringUtils.isEmpty(sessionA) 
                            ? Mono.empty() 
                            : myDatabaseService.findByKeyOne(sessionA);

return sessionAMono
         .switchIfEmpty(Mono.defer(() -> myDatabaseService.findByAnotherSession(sessionB)));

在这种情况下,两种情况下 sessionA 为空,以及 myDatabaseService.findByKeyOne(sessionA) returns 一个空结果(假设它确实如此)。

编辑:
与您的关注无关,但我想在您的 findByKeyOne 函数中指出,因为 myDatabase.find() 正在返回一个 Mono,所以用 try catch 包装它是行不通的,因为它是异步的。这意味着您需要处理同一流中的任何潜在错误。你可以这样做:

return myDatabase.find()
            .onErrorResume(throwable -> Mono.empty();