2016-11-10 11 views
1

ページネーションを使用してAPIをクエリする必要があります。しかしAPIが奇妙なので、応答が空(項目が含まれていない)になるまでクエリを実行する必要があります。実際にそれを行う、しばらくしてJavaで行われスカラ、ページングなし最大

do { 
    objects = doQuery(from); 
    from += 200 
} while (!objects.isEmpty()) 

しかし、私はScalaでそれを変換したいと思います。私の最初のアイデアは、ステップとtakeWhileでストリームを使用することです:

Stream.iterate(0)(_+200) 
    .map(from => doQuery(from)) 
    .takeWhile(objects -> !objects.isEmpty) 

しかし、別の変更は、doQuery戻りFutureを作ります。したがって、私はtakeWhileでテストを実行することはできませんし、それを行う方法(おそらく再帰呼び出し)に関するベストアイデアはありません。 うまくいけば、この新しいコードでは、これはあなたの最初の時間は、できるだけ早く残りは空になりますようfalseなりますStream[Future[(Boolean, T)]]を与えるオブジェクトごとに別のものを教えてくれますアッカの俳優(何も返さする必要はありません)

+2

可変性の状態を公開していない限り、scalaではdo/whileはOKです。 – dveim

+0

@dveimありがとう。はい、私はそれを知っている、ちょうどもっと "機能的な"スタイルを使用して喜んで。 –

+0

副作用をスキャンするストリームが必要なので、私はfs2またはakka-streamsに行きますが、stdlibストリームよりも少し痛いかもしれません。 – Reactormonk

答えて

0

になります。ブロックせずにtakeWhileを実行する方法がわかりません。

Stream.iterate(0)(_+200) 
    .scanLeft(Future((true, List[Int]())))({case (prev, from) => 
     prev.flatMap({case (cont, _) => 
     if(cont) { 
      doQuery(from).map(res => (res.isEmpty, res.toList)) 
     } else { 
      Future((false, List())) 
     } 
     }) 
    }) 
関連する問題