当前位置: 首页 > 知识库问答 >
问题:

如何在Reactorwebflux中浓缩一个物体?

阎裕
2023-03-14

我有接口

    public interface Enricher {
       Mono<MyObject> enrich(MyObject obj);
    }

我有这个接口的实现,它返回更新后的MyObject。

我有另一个名为CompositeEnricher的实现,它接受构造函数中的Enricher列表并执行扩展。

在非反应性的世界里,我会写这样的东西

/*
  Please note that following code is applicable only if Enricher interface returns MyObject instead of Mono<MyObject>
*/

public class CompositeEnricher implements Enricher {

  private final List<Enricher> enrichers;

  public CompositeEnricher(List<Enricher> enrichers) {
    this.enrichers = enrichers;
  }

  @Override
  public MyObject enrich(MyObject myObject) {
    MyObject updated = myObject;
    for(Enricher enricher : enrichers) {
      updated = enricher.enrich(updated);
    }
    return updated;
  }
}

如何将其更改为反应式,以便Enricher的每个实现返回Mono,包括实现Enricher接口的CompositeEnricher?

共有2个答案

夏季萌
2023-03-14

我用Mono解决了这个问题。展开方法。但我必须使用enrichers。迭代器()。我想知道我是否可以在反应链中加入enrichers,而不是使用迭代器。

@Override
    public Mono<User> enrich(User user) {
        Iterator<Enricher> iterator = enrichers.iterator();
        Function<User, Publisher<User>> enrichmentFunction = u -> iterator.hasNext() ? iterator.next().enrich(u) : Mono.empty();
        return Mono.just(user)
                .expand(enrichmentFunction)
                .last();
    }
钱澄邈
2023-03-14

实际上这里根本不需要单独的CompositeEnrich类-给定一个List

Enricher composite = enrichers.stream()
        .reduce((e1, e2) -> myObj -> e1.enrich(myObj).flatMap(myObj2 -> e2.enrich(myObj2)))
        .get();

当然,如果需要的话,您可以将其充实到一个类中,但您也可以将其作为助手方法实现。

 类似资料:
  • 我正在使用espresso进行测试,在一个页面中有多个AdapterViews,例如,ID:r.id.list1,r.id.list2 如何选择特定的listview并在其上尝试onData?

  • 问题内容: 我正在用Python编写脚本,但有一个问题: 如您所见,此代码非常多余。我试着像这样压缩它: 但是,PyQt4期望为类本身而不是实例提供类方法。因为没有为该类定义代码,所以将代码移出该块也不起作用,所以我真的不知道该怎么做。 谁能看到压缩此代码的方法? 问题答案: 有很多方法可以做到:类装饰器,元类和Mixin。 常用助手功能: 类装饰器 用法 如果不支持类装饰器,则可以尝试: 元类

  • 我有一个这样的事件来源 我需要通过用户过去的网页访问来丰富我的事件流。(我在数据库中拥有信息,我可以将其用作Flink源) 如何确保在开始处理事件流之前,我已经准备好了扩展数据 我不想从流中进行DB调用。

  • null 动画/转换被禁用,但这不会阻止CircularProgressLayout动画化。 我尝试,但即使这样,在第一次单击和第二次单击之间也要等待2秒。 我还试图滥用作为黑客来确认退出应用程序。这确实有效,但这是一个黑客。我只想让浓缩咖啡点击两次。 有什么建议如何使浓缩咖啡点击两次而不等待动画?

  • 是否可以在ViewPager中单击ListView的第一项? 如果像这样运行测试,第一项永远不会被单击。 是否有其他方法单击列表的第一项?

  • 我目前正在使用Espresso对一个Android应用程序进行编程截图。我正在成功地使用 问题是,根据官方浓缩咖啡文档的以下假设: 消息队列为空。 当前没有正在执行任务的AsyncTask实例。 所有开发人员定义的空闲资源都是空闲的。 通过执行这些检查,Espresso大大增加了在任何给定时间只能发生一个UI操作或断言的可能性。此功能为您提供了更可靠和可靠的测试结果。 当运行时,我无法执行任何测试