在Scala中有一个Stream类,它非常像迭代器.主题Scala中Iterator和Stream之间的区别?提供了两者之间相同点和不同点的一些见解.
看看如何使用流非常简单,但我没有很多常见的用例,我会使用流而不是其他工件.
我现在的想法:
所以我错过了任何重大用途吗?或者它是大多数开发人员的偏好?
谢谢
我使用opencsv来解析csv文件,我的代码是
while( (line = reader.readNext()) != null ) { .... }
Run Code Online (Sandbox Code Playgroud)
我收到编译器警告说:
comparing values of types Unit and Null using `!=' will always yield true
[warn] while( (aLine = reader.readNext()) != null ) {
Run Code Online (Sandbox Code Playgroud)
我应该怎么做while循环?
当编写在Stream(s)上运行的函数时,存在不同的递归概念.第一个简单的意义在编译器级别上不是递归的,因为如果不立即计算尾部,那么函数会立即返回,但返回的流是递归的:
final def simpleRec[A](as: Stream[A]): Stream[B] =
if (a.isEmpty) Stream.empty
else someB(a.head) #:: simpleRec(a.tail)
Run Code Online (Sandbox Code Playgroud)
上述递归概念不会引起任何问题.第二个是在编译器级别上真正的尾递归:
@tailrec
final def rec[A](as: Stream[A]): Stream[B] =
if (a.isEmpty) Stream.empty // A) degenerated
else if (someCond) rec(a.tail) // B) tail recursion
else someB(a.head) #:: rec(a.tail) // C) degenerated
Run Code Online (Sandbox Code Playgroud)
这里的问题是C)编译器将该情况检测为非tailrec调用,即使没有执行实际调用.这可以通过将流尾部分解为辅助函数来避免:
@tailrec
final def rec[A](as: Stream[A]): Stream[B] =
if (a.isEmpty) Stream.empty
else if (someCond) rec(a.tail) // B)
else someB(a.head) #:: recHelp(a.tail)
@tailrec
final def recHelp[A](as: Stream[A]): Stream[B] =
rec(as)
Run Code Online (Sandbox Code Playgroud)
在编译时,这种方法最终会导致内存泄漏.由于尾递归rec最终是从recHelp …
据我了解,Stream保留最近评估的元素.我想它不会保留所有评估的元素(这是不可行的),因此它可能使用一些内部"缓存".
这是对的吗?我可以控制此缓存的大小和策略吗?
可以使用流(懒惰列表)从一个数字(例如两个为了简单)中提取需求.Iteratees可用于处理来自单一来源的数据.
是否有类似Iteratee的功能概念来处理多个输入源?我可以想象一个Iteratee,它的状态信号来自它想要拉动的源.
在以下情况
trait T {
@tailrec
def consume[A](as: Stream[A]): Unit = {
if (as.isEmpty) ()
else consume(as.tail)
}
}
object O extends T
Run Code Online (Sandbox Code Playgroud)
主叫O.consume(Range(1, N).toStream)用N足够大的,程序将运行的存储器,或者至少将消耗O(N),而不是所需要的O(1).
我正在编写一个Scala库,以便更轻松地查询分页JSON API.每个API调用都返回一个如下所示的对象:
{
"count": 100,
"current_page": 1,
"total_pages": 2,
"records": [
...
]
}
Run Code Online (Sandbox Code Playgroud)
我想有一个函数返回某种迭代器,如MyIterator [Record].在Scala世界中是否有任何标准方法可以做到这一点,甚至可能在标准库中构建可以帮助我的方法?
我通常使用lift-json进行JSON解析,如果这有用的话.
谢谢.
scala ×7
stream ×4
api ×1
haskell ×1
iterate ×1
iterator ×1
memory-leaks ×1
pagination ×1
recursion ×1
while-loop ×1