【发布时间】:2020-11-19 01:23:07
【问题描述】:
我有一个整数列表 {2,4,6,8,9,10,12}
为了简化我的问题,我的目标是获取所有偶数,直到遇到奇数。所以我的结果应该是 -> {2,4,6,8, 9}
另外,我有一个演员说一个数字是偶数还是奇数(为简单起见)
我做了以下事情:-
CompletionStage<List<Integer>> result = Source.from(integerList)
.ask(oddEvenActor, OddEvenResponse.class, Timeout.apply(1, TimeUnit.SECONDS))
.map(oddEvenResult -> if(oddEvenResult.isOdd()){
//stop processing further elements
}
else {
return oddEvenResult.number();
})
.runWith(Sink.seq(), materializer)
那么,一旦我遇到一个奇怪的元素,我怎样才能停止对其他元素的处理呢?
一旦流完成,CompletionStage“结果”应该包含 2,4,6,8,9。
我查看了 statefulMapConcat (https://doc.akka.io/docs/akka/current/stream/operators/Source-or-Flow/statefulMapConcat.html) 但是,这仍然会处理 9 之后的其他元素,因为仍然会“询问”演员
当然我可以做到以下几点:-
-
有一个 resultList 变量(全局),我执行一个 resultList.add(oddEvenResult.number()),然后在遇到奇数时抛出异常。我必须编写一个自定义异常类来搭载这个全局结果列表。
-
按照@Jeffrey Chung 的建议使用 takeWhile,但 OddEvenActor 仍然被“要求”处理元素 10 和 12。这是没有意义的。
有没有更简洁的方法来实现这一点?
【问题讨论】:
-
你如何“停止处理”?
标签: java scala akka akka-stream akka-http