Генерация потока <Result>из двух потоков - PullRequest
0 голосов
/ 29 июня 2018

Я сейчас работаю с Flux. Я хочу создать один Flux<Result> из двух разных объектов Flux. Я знаю, что должен использовать BiFunction, но я не знаю как. Первый объект имеет PK и второй FK для первого объекта. Я хочу, чтобы zip тот объект, который PK = FK.

Описание проблемы: У меня есть случай на работе, где у меня есть список домов и список, в котором я был. Мне нужно вернуть результат со всеми домами, я только поменяю флаг true / false на объекте Result. Второй список, конечно, может иметь меньше элементов.

Кто-нибудь может предложить что-то подобное или каким-либо другим способом?

@RunWith(SpringRunner.class)
@SpringBootTest

public class WholesaleControllerTest {

@Test
public void testZipFlux() {
    Flux<Flux1> flux1 = Flux.just(new Flux1(1, "test1"), new Flux1(2, "test2"), new Flux1(3, "test3"));
    flux1.subscribe(item -> System.out.println("Flux1 " + item));
    Flux<Flux2> flux2 = Flux.just(new Flux2(2, true), new Flux2(1, false), new Flux2(3, true));
    flux2.subscribe(item -> System.out.println("Flux2 " + item));


    Flux<Result> = ...//TODO zip flux1 and flux2 to RESULT

}

@Getter
@Setter
@AllArgsConstructor
class Flux1{
    private int id;
    private String value;
}

@Getter
@Setter
@AllArgsConstructor
class Flux2{
    private int id_fk_flux2;
    private boolean value;
}


@Getter
@Setter
@AllArgsConstructor
class Result{
    private int id;
    private String flux1Value;
    private boolean flux2Value;
}

}

1 Ответ

0 голосов
/ 29 июня 2018

Это один из способов сделать. Но я должен сказать, что это не строго реактивное программирование (потому что я использую блок на первом потоке для создания карты).

Сказав это, я не могу думать ни о каком другом пути

Map<Integer, Flux1> flux1Map = flux1.collectMap(Flux1::getId, Function.identity()).block();

Flux<Result> results = flux2.flatMap(item -> {
        //TODO : Handle cases like key not found in flux1
        Flux1 entry = flux1Map.get(item.getId_fk_flux2());
        Result result = new Result(entry.getId(), entry.getValue(), item.isValue());
        return Mono.just(result);
    }).collectList().flatMapMany(Flux::fromIterable);
...