Reactor применить Flux для каждого выброса другого Flux? - PullRequest
0 голосов
/ 13 марта 2019

У меня есть два Flux объекта, напр .::1002*

Flux<Item> и Flux<Transformation>

data class Item(val value: Int)

data class Transformation(val type: String, val value: Int)

Я хотел бы применить все преобразования к каждому элементу - что-то вроде:

var item = Item(15)

val transformations = listOf(Transformation(type = "MULTIPLY", value = 8), ...)

transformations.forEach {
  if (it.type == "MULTIPLY") {
    item = Item(item.value * it.value) 
  }
}

, но при Flux и Item и Transformation

1 Ответ

3 голосов
/ 14 марта 2019

Вы можете использовать java.util.function.UnaryOperator вместо Transformation класса. Надеюсь, что этот пример Java может помочь вам:

@Test
public void test() {
    Flux<Item> items = Flux.just(new Item(10), new Item(20));
    Flux<UnaryOperator<Item>> transformations = Flux.just(
            item -> new Item(item.value * 8),
            item -> new Item(item.value - 3));

    Flux<Item> transformed = items.flatMap(item -> transformations
            .collectList()
            .map(unaryOperators -> transformFunction(unaryOperators)
                    .apply(item)));

    System.out.println(transformed.collectList().block());
}

Function<Item, Item> transformFunction(List<UnaryOperator<Item>> itemUnaryOperators) {
    Function<Item, Item> transformFunction = UnaryOperator.identity();
    for (UnaryOperator<Item> itemUnaryOperator : itemUnaryOperators) {
        transformFunction = transformFunction.andThen(itemUnaryOperator);
    }
    return transformFunction;
}
...