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

有没有一种方法可以打印出一个流程中所有操作的链?

闾丘诚
2023-03-14

给定项目Reactor的通量或Mono,有没有办法让通量或Mono打印出操作链的样子。例如,下面给出了代码。

Fulx flux = Flux.just("a","b","c")
              .map( v -> v.toUpperCase())
              .log();

有没有办法让flux打印出处理管道中链接的所有操作员的列表?一些漂亮的ascii格式文本或大理石图?

printTheFlux(通量)应该制作一个很好的打印输出,显示上面示例中所有运算符的结构。我不期望在lambda中生成代码只是一种查看哪些运算符链接在一起的方式。

共有2个答案

曹光霁
2023-03-14

很好的建议!

然而,等待它,我们可以有这样的东西:

    Disposable flux = Flux.just("a", "b", "c")
            .map(String::toUpperCase)
            .doOnNext(FluxUtil::print)
            .subscribe();

其中FLuxUtil::print只是一个静态方法,您可以用不同的方式编写。

以下是我的完整代码

public class FluxUtil {

    private static String s = "";

    public static void main(String[] args) {

        Disposable flux = Flux.just("a", "b", "c")
                .map(String::toUpperCase)
                .doOnNext(FluxUtil::print)
                .subscribe();
    }

    private static Object print(Object o) {

        s = !s.isEmpty() ? s.concat("->") : s;
        s = s.concat(o.toString());
        System.out.println(s);
        return o;
    }
}
倪阳飇
2023-03-14

使用Scannable接口执行此操作有部分构建块:

public String textRepresentation(Flux<?> flux) {
    Scannable sc = Scannable.from(flux);
    //scan the last operator in the chain and ask if it knows its parents
    List<String> names = sc.parents().map(Scannable::operatorName)
                                     .collect(Collectors.toList());
    //as it traverses the chain from bottom to top, we need to reverse the order
    Collections.reverse(names);
    //need to also add the last operator
    names.add(sc.operatorName());
    return names.toString();
}

@Test
public void textRepresentationTest() {
    Flux flux = Flux.just("a","b","c")
                    .map( v -> v.toUpperCase())
                    .log();

    System.out.println(textRepresentation(flux));
}

印刷品

[map, log]

但并非所有操作符都完全支持它(例如,您可以看到,源代码并不完全支持)。

 类似资料:
  • 我在循环后连接了一个DB查询的结果列表,得到了预期的输出,但值之间没有任何分隔符: 有没有办法在值中添加一个换行分隔符以获得漂亮的打印效果?比如: 或 或

  • 问题内容: 假设我有以下代码: 这段代码的问题在于,协程内部的循环永远不会完成第一次迭代,而大小会不断增加。 为什么会这样发生,我该怎么解决? 我无法摆脱单独的线程,因为在我的真实代码中,我使用了单独的线程与串行设备进行通信,而且我还没有找到使用的方法。 问题答案: 不是线程安全的,因此您不能直接在多个线程中直接使用它。相反,您可以使用,它是提供线程感知队列的第三方库: 还有(全披露:我写了它),

  • 作为一个学校项目,我正在开发一个坦克游戏,我正在努力使它尽可能的用户友好(比如可定制的按键绑定、显示设置)。然而,我不希望游戏窗口失去它的比例,所以我想我会在游戏窗口的两侧添加边框,以支持宽屏幕。 我附上了一张图片来说明我在寻找什么: 因此,为了让它工作,我需要一种制作“屏幕层”的方法。基本层是整个屏幕,在屏幕两侧添加了一些图形和显示分数的字体。然后,第二层将呈现在屏幕的中间,这将是游戏窗口,其宽

  • 问题内容: 我有一个使用AngularJS的html页面,我想从中打印一个div。有Angular的方法吗?..或它只是下面的经典javascript方法: 如果AngularJS周围没有任何东西,您能建议不使用JavaScript函数的方式吗(例如:doc.getElementById())..一种类似于AngularJS方式的方法吗? 谢谢, 问题答案: 我创建了一个简单的指令,用于使用ifr

  • 我知道一个测试可以通过运行来运行,在sbt中, 有没有办法告诉sbt/scalatest在没有标签的情况下运行单个测试?例如: 这意味着“在类中运行第二个测试。不管它是什么”。我们有一堆测试,没有人费心去标记它们,那么有没有办法在没有标签的情况下运行单个测试?

  • 我正在使用Kafka 0.9新的消费者API。 我让Kafka为消费者负责补偿。我让消费者在多台机器上阅读相同的主题。 我试图找出以下内容: 在消费者组中注册的消费者 每个消费者的偏移量 我以为消费者-群体-消费者关系会存储在ZooKeeper中。我在ZooKeeper中看到了消费者节点,它没有孩子。 通过查看代码,我可以知道的偏移量被写入了kafka,但我不知道它们被写入了哪个主题?