【问题标题】:How to filter out empty flux如何过滤掉空焊剂
【发布时间】:2020-04-23 22:32:57
【问题描述】:

例如,我有以下代码创建一个包含 3 个数字 1,2,3 的列表的 Mono。我想过滤掉号码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
})

一个后续问题

如果在我的代码中我在数字为 1 时返回 Flux.empty() 会怎样

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

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

在过滤器中,如何检测i是否为空通量并将其过滤掉

【问题讨论】:

    标签: project-reactor reactive reactor


    【解决方案1】:

    看看这个例子。您可以使用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));
    

    如果你真的想用你的方法,那么我们需要像这样过滤

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

    【讨论】:

    • 谢谢,我刚刚添加了一个后续问题。你能解释一下吗?
    • 请注意,通常不鼓励像这样比较 Flux 实例,例如。 empty() 工厂方法将来可能会返回一个新实例
    • @SimonBaslé,老实说我也不喜欢这个。手柄是正确的选择。但是我们有什么办法过滤空对象吗?
    • 在 flatMap 中,返回一个空的发布者会有效地过滤自身,就好像没有传播任何内容一样。相当于忽略源元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2020-02-29
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多