有没有办法打印出 Flux 中所有操作的链



给定项目反应堆的FluxMono,有一种方法可以让Flux或Mono打印出算子链的样子。例如,给定下面的代码。

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

有没有办法让助焊剂打印出处理管道中链接的所有运算符的列表?一些漂亮的 ascii 格式文本或弹珠图?

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

使用 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]

并非所有运营商都完全支持它(如您所见,例如,just源不支持(。

不错的建议!

但是,等待它,我们可以有这样的东西:

    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;
    }
}

最新更新