我来自ReactiveX,我们有运营商 defer ,以便创建Observable
并在我们有订阅者后获得排放值。
在Akka Streams中,我想知道是否存在类似的东西:
@Test def defer(): Unit = {
var range = 0 to 10
val graphs = Source(range)
.to(Sink.foreach(println))
range = 10 to 20
graphs.run()
Thread.sleep(2000)
}
拥有此代码,甚至在我们执行run()之前,更改范围的值,由于蓝图已经创建,因此值不会更改,并且会发出0到10。
在Akka Streams中有类似Observable.defer
的内容吗?
解:
我找到了解决方案,解决方案是使用 lazy 关键字,我们提供了一个在运行流后执行的功能。
我会保留这个问题,以防万一有更好的方法或其他人有同样的问题
@Test def defer(): Unit = {
var range = 0 to 10
val graphs = Source.lazily(() => Source(range))
.to(Sink.foreach(println))
range = 10 to 20
graphs.run()
Thread.sleep(2000)
}
问候。
答案 0 :(得分:1)
最简单的方法可能是Source.fromIterator(() => List(1).iterator)
或类似的东西。在Akka Streams API中,我们选择尝试保留最小的操作符集,因此有时您可能会遇到单行中可以实现相同的情况,但是不会像在延迟的情况下那样直接使用名称。如果您认为这是一个很常见的事情,请通过github.com/akka/akka告诉我们,我们可以考虑将其添加为API。
请注意,还有fromFuture
和其他版本,根据您的实际使用情况(特别是与Promise结合使用时),虽然没有直接相关可能会有用。