Я новичок в реактивном программировании и может случиться так, что этот вопрос легко разрешим или я делаю что-то совсем не так. Рассмотрим следующий интерфейс
interface NumbersOperator{fun apply(value:Double,value2:Double):Mono<Double>}
выполнение
class Plus(val name:String):NumbersOperator{
fun apply(value:Double,value2:Double):Mono<Double>{
return Mono.just(value+value2)
}
}
На данный момент у меня есть список `
val plusOperators = listOf(Plus("first"), Plus("second"), Plus("third"))
` и способ, которым я комбинирую операторы, следующий
fun combine():Mono<Double>{
val first=plusOperators.firstOrNull(it.name= = "first")
val second=plusOperators.firstOrNull(it.name= = "second")
val third=plusOperators.firstOrNull(it.name= = "third")
return first.apply(1.0,1.0).map{it*1.0}.flatMap{second.apply(it,1.0)}.map{it*1.0}.flatMap{third.apply(it,1.0)}
}
На данный момент я могу жить с этим, но было бы намного проще и универсальнее, если бы я мог просто создать вышеуказанную цепочку из списка plusOperators. Обратите внимание, что это просто упрощение того, что я делаю, в основном мне нужно сопоставить результат предыдущего и вызвать другой моно и так далее.
Вы можете просто свернуть список операторов, например:
fun combine(): Mono<Double> {
val plusOperators = listOf(Plus("first"), Plus("second"), Plus("third"))
return plusOperators.fold(Mono.just(1.0)) { acc, op ->
acc.flatMap { op.apply(it, 1.0) }
}
}
замечательно, именно то, что я искал