Как объединить списки Java Flux в один список из внешних источников

В контроллере отдыха spring -boot 2.0 я создал следующий код, который работает как надо:

@ResponseBody
@GetMapping("/test3")
Mono<List<String>> test3(){
    List<String> l1 = Arrays.asList("one","two","three");
    List<String> l2 = Arrays.asList("four","five","six");

    return Flux
               .concat(Flux.fromIterable(l1),Flux.fromIterable(l2))
               .collectList();
}

Моя проблема возникает из-за попытки сделать то же самое из внешнего источника данных. Я создал следующий тестовый пример:

@ResponseBody
@GetMapping("/test4")
Flux<Object> test4(){
    List<String> indecies = Arrays.asList("1","2");
    return Flux.concat(
            Flux.fromIterable(indecies)
        .flatMap(k -> Flux.just(myRepository.getList(k))
                          .subscribeOn(Schedulers.parallel()),2
                )
        ).collectList();
}

Где myRepository - это следующее:

@Repository
public class MyRepository {

List<String> l1 = Arrays.asList("one","two","three");
    List<String> l2 = Arrays.asList("four","five","six");
    Map<String, List<String>> pm = new HashMap<String, List<String>>();

MyRepository(){
    pm.put("1", l1);
    pm.put("2", l2);
}

List<String> getList(String key){
    List<String> list = pm.get(key);
    return list;
}   
}

Мой код с меткой test4 дает мне ошибку подсказки кода:

Несоответствие типа: невозможно преобразовать из Flux ‹List‹ String >> в Publisher ‹? расширяет Publisher ‹? расширяет объект >>

Итак, несколько вопросов:

  1. Я думал, что Флюкс был издателем? Так почему ошибка?
  2. Что я делаю не так в тесте 4, чтобы он выдал тот же результат, что и в тесте 3?

Ожидаемый результат: [[«один», «два», «три», «четыре», «пять», «шесть»]]


person Clark W    schedule 23.06.2017    source источник
comment
Flux - это Publisher, но Publisher не Flux. Разве вы не должны просто использовать Flux.fromIterable вместо Flux.just?   -  person M. Deinum    schedule 23.06.2017
comment
@ M.Deinum, который работал: Mono ‹List ‹String›› test6 () {List ‹String› indecies = Arrays.asList (1,2); вернуть Flux.fromIterable (индексы) .flatMap (k - ›Flux.fromIterable (myRepository.getList (k)). subscribeOn (Schedulers.parallel ()), 2) .collectList (); }   -  person Clark W    schedule 24.06.2017


Ответы (1)


Используя комментарий М. Дейнума, вот что работает:

@ResponseBody
@GetMapping("/test6")
Mono<List<String>> test6(){
    List<String> indecies = Arrays.asList("1","2");

    return Flux.fromIterable(indecies)
               .flatMap(k -> Flux.fromIterable(myRepository.getList(k)).subscribeOn(Schedulers.parallel()),2)
               .collectList();

}
person Clark W    schedule 23.06.2017