2016-11-10 65 views
1

我必須查詢帶分頁的API。但是因爲API很奇怪,我必須查詢它直到響應爲空(不包含任何項目)。斯卡拉,無最大值尋呼

實際上它是用Java語言寫有一個做,而:

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

但我想它轉換成階。我最初的想法是使用流與步和takeWhile:

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

但另一個變化使doQuery返回Future。因此,我無法在takeWhile中進行測試,也沒有關於如何做的最佳方法(可能是遞歸調用)。 希望這個新代碼將是爲阿卡演員會告訴其他每個對象(不需要任何回報)

+2

只要你不暴露可變狀態,你可以在scala中確定/確定。 – dveim

+0

@dveim謝謝。是的,我知道,只是願意使用更「實用」的風格。 –

+0

你想要一個掃描副作用的流,所以我會去fs2或akka-streams,可能會比stdlib流有點痛苦。 – Reactormonk

回答

0

這給你Stream[Future[(Boolean, T)]],其中,第一時間將false只要其餘的將是空的。不知道如何在沒有阻塞的情況下做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())) 
     } 
     }) 
    })