无限Java流和反应器流量之间的差异
我试图分别找出无限流量和无限流量之间的概念差异(如果有) 就这一点而言,我提出了以下无限流/流量的例子无限Java流和反应器流量之间的差异,java,java-stream,flux,spring-webflux,reactor,Java,Java Stream,Flux,Spring Webflux,Reactor,我试图分别找出无限流量和无限流量之间的概念差异(如果有) 就这一点而言,我提出了以下无限流/流量的例子 @Test public void infinteStream() { //Prints infinite number of integers Stream<Integer> infiniteStream = Stream.iterate(0, i -> i+1); infiniteStream.forEach(System.out::println); }
@Test
public void infinteStream() {
//Prints infinite number of integers
Stream<Integer> infiniteStream = Stream.iterate(0, i -> i+1);
infiniteStream.forEach(System.out::println);
}
@Test
public void infiniteFlux() {
//Prints infinite number of date strings (every second)
Flux<LocalDateTime> localDateTimeFlux = Flux.interval(Duration.ofSeconds(1))
.map(t -> LocalDateTime.now());
localDateTimeFlux.subscribe(t -> System.out.println(t.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"))));
}
@测试
公共无效inintestream(){
//打印无穷多个整数
Stream infiniteStream=Stream.iterate(0,i->i+1);
infiniteStream.forEach(System.out::println);
}
@试验
公共空间无限流(){
//打印无限数量的日期字符串(每秒)
Flux localDateTimeFlux=通量间隔(持续时间秒(1))
.map(t->LocalDateTime.now());
localDateTimeFlux.subscribe(t->System.out.println(t.format(模式的DateTimeFormatter.of(“yyy-MM-dd hh:MM:ss”)));
}
关于这些示例,我有一个问题:对于infinteFlux()和Flux(分别是infinteFlux()和Stream),是否有一个模拟?更一般地说,无限流和流量之间有什么区别吗
提前感谢,,
Felix
流
和通量
非常不同:
是一次性的,而您可以多次订阅Stream
Flux
是基于拉动的(使用一个元素调用下一个元素),而Stream
有一个混合推/拉模型,发布者可以推送元素,但仍然必须尊重消费者发出的背压信号Flux
是同步序列,而流
可以表示异步序列通量
流
生成一个无限的值序列,它们的生成和使用速度尽可能快。在您的Flux
示例中,您正在以固定的间隔生成值(我不确定您是否可以使用流
)。使用Flux
,您还可以Flux。生成不带间隔的序列,就像您的流
示例一样
一般,您可以考虑<代码>通量>代码>作为<代码>流>代码> +>代码>完整的未来< /代码>,用:
- 很多强大的操作员
- 背压支架
- 对发布者和订阅者行为的控制
- 对时间概念的控制(缓冲值窗口、添加超时和回退等)
- 为通过网络(从数据库或远程Web API)获取的异步序列量身定制的东西
同时,我为infiniteFlux()提出了一个流解决方案,以供参考:
@测试
公共无效无限流(){
Stream infiniteStream=Stream.iterate(0,i->i+1).peek(x->{
LocalDateTime t=LocalDateTime.now();
t、 格式(模式的DateTimeFormatter.of(“yyyy-MM-dd hh:MM:ss”);
系统输出打印ln(t);
});
infiniteStream.forEach(x->{
试一试{
睡眠(10000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
});
}
这真是难看。然而,它表明,从(非常)原则上讲,可以根据流重写简单的通量示例。亲爱的Brian,感谢您解释这些差异!我将使用Flux.generate:-)尝试您的建议,在什么情况下,您应该使用流而不是Flux?
@Test
public void infiniteFluxWithStream() {
Stream<Integer> infiniteStream = Stream.iterate(0, i -> i+1).peek(x->{
LocalDateTime t = LocalDateTime.now();
t.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));
System.out.println(t);
});
infiniteStream.forEach(x->{
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});