project reactor (2)
以编程方式创建序列
同步 generate
以编程方式创建Flux的最简单形式是通过generate方法,该方法带有一个generator函数。
这用于同步发射和一对一发射,这意味着接收器是SynchronousSink,并且其next()方法在每次回调调用中最多只能调用一次。 然后,可以另外调用error(Throwable)或complete(),但这是可选的。
简单示例:
Flux<String> flux = Flux.generate(
// 提供初始状态值0。
() -> 0,
(state, sink) -> {
// 我们使用状态来选择要发出的信号(乘法表3中的一行)。
sink.next("3 x " + state + " = " + 3*state);
if (state == 5) {
// 选择何时停止。
sink.complete();
}
// 返回在下一个调用中使用的新状态(除非序列在此调用中终止)。
return state + 1;
});
flux.subscribe(System.out::println);
输出:
3 * 0 = 0
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
或者使用可变的 < s > 例如,可以使用单个AtomicLong作为状态来重写上面的示例,并在每个回合中对其进行更改:
Flux<String> flux = Flux.generate(
AtomicLong::new,
(state, sink) -> {
// 元子类递增
long i = state.getAndIncrement();
sink.next("3 * " + i + " = " + 3*i);
if (i == 5) {
sink.complete();
}
return state;
});
flux.subscribe(System.out::println);
包含Consumer 的 generate:
Flux<String> flux = Flux.generate(
AtomicLong::new,
(state, sink) -> {
long i = state.getAndIncrement();
sink.next("3 * " + i + " = " + 3*i);
if (i == 5) {
sink.complete();
}
return state;
},
// 我们将最后一个状态值(6)视为此Consumer lambda的输出。
(state) -> System.out.println("state: " + state)
);
flux.subscribe(System.out::println);
输出:
3 * 0 = 0
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
state: 6
如果状态包含在过程结束时需要处理的数据库连接或其他资源,则使用者lambda可以关闭该连接或以其他方式处理应在过程结束时完成的任何任务。