我试图找出无限流和无限磁通量(如果有)之间的概念差异。
为此,我想出了无限流/通量的以下示例
@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()的类似物?而且,更笼统地说,无限流和通量之间有什么区别吗?
预先感谢, 费利克斯
答案 0 :(得分:6)
Stream
和Flux
完全不同:
Stream
是一次性使用,而您可以多次订阅Flux
Stream
是基于拉动的(消耗一个元素调用下一个元素),而Flux
具有混合推/拉模型,发布者可以推入元素,但仍然必须遵守由元素发出的背压。消费者Stream
是同步序列,而Flux
可以表示异步序列在示例中,您使用Stream
生成了一个无限值序列,它们的生成和消耗速度尽可能快。在您的Flux
示例中,您以固定的时间间隔生成值(我不确定您可以使用Stream
来完成此操作)。借助Flux
,您也可以Flux.generate
无间隔的序列,就像您的Stream
示例一样。
通常,您可以考虑将Flux
与Stream
+ CompletableFuture
混合使用,
答案 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。