2016-11-10 56 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())) 
     } 
     }) 
    })