我有一个过滤器来过滤掉流中不正确的项。在某些边缘情况下,这可能会导致所有项都被过滤掉。当发生这种情况时,运行reduce时流会失败,错误为-java.util.NoSuchElementException: reduce over empty stream
。
如何处理这种情况以返回有意义的响应?
我试过像这样的监督-
val decider: Supervision.Decider = {
case _ => Supervision.Stop
case e : NoSuchElementException => Supervision.stop
}
RunnableGraph.
toMat(Sink.reduce[Int](_ + _)
.withAttributes(ActorAttributes.supervisionStrategy(decider)))(Keep.both)
.run()
我也试过recover
,但似乎都不起作用。
我需要处理此案例以返回有意义的响应。
任何帮助都将不胜感激。
2条答案
按热度按时间kuuvgm7e1#
可能值得考虑使用
Sink.fold
而不是Sink.reduce
:如果没有合理的零/单位元素,你可以有一些更一般化的东西:
如果没有元素,返回的图形将以
None
完成,或者以约简结果的Some
完成。编辑:您也可以只在
Source
/Flow
上使用orElse
,代替上面的.concat.statefulMapConcat
:ax6ht2ek2#
因为你使用的是
Sink.reduce[Int]
,所以你可以添加一个Source
,它保证只有一个0
元素,这样Sink.reduce[Int]
就可以工作,并产生0
。这里有一个例子