使用 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();
}
});
}
我有一个数据库,我想在其中使用唯一键查看我的条目。但有时我需要允许该键重复,所以我不能使用索引。
我有这样的东西
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();
}
});
}