2

为什么我的 takeWhile 无法与我的 Stream 一起工作的问题清楚地表明这takeWhile()是懒惰的:

Stream.from(1).takeWhile(_ < 5) //Stream(1, ?) 

但是对于这个问题,解决方案似乎是人们可以toList根据需要使用它来强制评估。但是,如果您想要的不是列表或特定值,而是 continueStream怎么办?

似乎我可以通过强制评估来做到这一点,直到找到所需的值,然后Stream再次实例化并使用index,但肯定有更好的方法吗?

更新:显然我的措辞令人困惑;我想要提供的解决方案dropWhile

4

3 回答 3

7

您可以使用span

scala> val (before, after) = Stream.from(1).span(_ < 5)
before: scala.collection.immutable.Stream[Int] = Stream(1, ?)
after: scala.collection.immutable.Stream[Int] = Stream(5, ?)

或者,如果您只关心“持续流”,则dropWhile

scala> val after = Stream.from(1).dropWhile(_ < 5)
after: scala.collection.immutable.Stream[Int] = Stream(5, ?)
于 2012-07-11T19:02:23.307 回答
1

看来您正在寻找force

scala> val s = Stream.from(1).takeWhile(_<10)
s: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> s.force
res84: scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 4, 5, 6, 7, 8, 9)
于 2012-07-11T18:59:43.660 回答
0

很难理解您的要求 - 正如每个人回答不同的事情所看到的那样。这是另一种可能解释的答案:您希望流从一个值开始。好吧,在这种情况下,您可以这样做:

scala> Stream.from(1).dropWhile(_ < 5) //Stream(1, ?) 
res3: scala.collection.immutable.Stream[Int] = Stream(5, ?)
于 2012-07-11T21:45:50.387 回答