无限Java流和Reactor通量之间的区别

时间:2018-10-15 15:38:47

标签: 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 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"))));
}

关于这些示例,我有一个问题:是否有带Flux的infinteStream()和带Stream的infinteFlux()的类似物?而且,更笼统地说,无限流和通量之间有什么区别吗?

预先感谢, 费利克斯

2 个答案:

答案 0 :(得分:6)

StreamFlux完全不同:

  • Stream是一次性使用,而您可以多次订阅Flux
  • Stream是基于拉动的(消耗一个元素调用下一个元素),而Flux具有混合推/拉模型,发布者可以推入元素,但仍然必须遵守由元素发出的背压。消费者
  • Stream是同步序列,而Flux可以表示异步序列

在示例中,您使用Stream生成了一个无限值序列,它们的生成和消耗速度尽可能快。在您的Flux示例中,您以固定的时间间隔生成值(我不确定您可以使用Stream来完成此操作)。借助Flux,您也可以Flux.generate无间隔的序列,就像您的Stream示例一样。

通常,您可以考虑将FluxStream + CompletableFuture混合使用,

  • 许多强大的运营商
  • 反压支持
  • 控制发布者和订阅者的行为
  • 控制时间概念(缓冲值窗口,添加超时和后退等)
  • 为通过网络(从数据库或远程Web API)获取的异步序列量身定制的内容

答案 1 :(得分:1)

作为参考,与此同时,我为infiniteFlux()设计了一个Stream-Solution:

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

}

这确实很丑。但是,它表明,从(非常)原理上讲,可以用流重写简单的Flux-Examples。