Как отфильтровать пустой поток - PullRequest
0 голосов
/ 24 апреля 2020

Например, у меня есть следующий код, который создает Mono со списком из 3 чисел 1,2,3. Я хочу отфильтровать число 1. Результатом будет список из 2 чисел 2,3. Что я должен сделать в flatMapMany, чтобы он пропустил число 1?

Mono.just(new LinkedList<>{{
    add(1);
    add(2);
    add(3);
}})
.flatMapMany(number -> {
  if (number == 1) {
    // not return 
  }

  return number;
})
.collectList()
.map(numbers -> {
  // numbers should be 2,3
})

Последующий вопрос

, что если в моем коде я верну Flux.empty(), когда число равно 1

.flatMapMany(number -> {
  if (number == 1) {
    return Flux.empty() 
  }

  return number;
})
 .filter(i ->{
  // how to filter out Flux.empty() ?
})

В фильтре, как я могу определить, является ли i пустой поток, и отфильтровать его

1 Ответ

0 голосов
/ 24 апреля 2020

Посмотрите на этот пример. Вы можете использовать flatMapIterable для преобразования моно списка в Flux.

    Mono.just(List.of(1,2,3))
        .flatMapIterable(Function.identity())    
        .filter(i -> i != 1)
        .collectList()
        .subscribe(s -> System.out.println(s)); //prints [2,3]

Для последующего вопроса. Нам нужно использовать .handle, который является комбинацией методов map и filter.

Flux.fromIterable(List.of(1, 2, 3))
                .handle((number, sink) -> {
                    if (number != 1) {
                        sink.next(number);
                    }
                })
                .collectList()
                .subscribe(s -> System.out.println(s));

Если вы действительно хотите go с вашим подходом, то нам нужно отфильтровать как это

    Flux.fromIterable(List.of(1, 2, 3))
            .flatMap((number) -> number == 1 ? Flux.empty() : Flux.just(number))
            .collectList()
            .subscribe(s -> System.out.println(s));
...