Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无限Java流和反应器流量之间的差异_Java_Java Stream_Flux_Spring Webflux_Reactor - Fatal编程技术网

无限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();
    }
    });