给定项目反应堆的Flux
或Mono
,有一种方法可以让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;
}
}