使用 reactive java,只有当 flux 为空时才插入元素

Using reactive java, insert element only if flux is empty

我有一个数据库,我想在其中使用唯一键查看我的条目。但有时我需要允许该键重复,所以我不能使用索引。

我有这样的东西

Flux<Student> getStudentsBySomething(String something) {..}

Mono<Void> insert(Student student) {...}

Mono<Void> insertUnique(Student student) {
  // I want to write something like
  if (getStudentsBySomething().isEmpty()) {
     insert(student);
  } else{
     throw new RuntimeException(e);
  }
}

但我真的很困惑如何用响应式代码重写 insertUnique

更新一: 刚刚想出了以下解决方案。请问有没有更好的办法

Mono<Void> insertUnique(Student student) {
        return getStudentsBySomething(student.getSomething())
                .count()
                .flatMap(records -> {
                    if (records == 0) {
                        return insert(student);
                    } else {
                        return Mono.error(alreadyExist(student)); 
                    }
                });
    }

Mono<Void> insertUnique(Student student) {
  getStudentsBySomething()
    .collectList()
    .flatMap(students -> {
      if(students.isEmpty()) {
        return insert(student);
      } else {
        throw new RuntimeException(e);
      }
    };
}

也许是这样的?然后你不必收集整个 Flux 如果有很多项目可能会很糟糕:

 Mono<Void> insertUnique(Student student) {
        return getStudentsBySomething("test")
                .hasElements()
                .flatMap(hasStudents -> {
                    if (!hasStudents) {
                        return insert(student);
                    } else {
                        throw new RuntimeException();
                    }
                });
    }