我正在尝试映射文件流,但只评估第一个元素:
var fList = Stream(new java.io.File("test1") , new java.io.File("test2"))
//> fList : scala.collection.immutable.Stream[java.io.File] = Stream(test1, ?)
//|
fList.map(file => {
println(file.getAbsolutePath)
}) //> C:\Eclipse\scala-SDK-3.0.2-vfinal-2.10-win32.win32.x86\eclipse\test1
//| res0: scala.collection.immutable.Stream[Unit] = Stream((), ?)
阅读http://daily-scala.blogspot.com/2010/01/introducing-streams.html Streams are a special type of Iterable/Traversable whose elements are not evaluated until they are requested. Streams are normally constructed as functions.
由于我在流媒体上使用地图,因此应评估流中包含的每个文件,从而输出其名称?
更新:我发现这很有用,是使用Stream:Reading files from a directory in Scala
的替代方法答案 0 :(得分:5)
根据Stream.map
文档:
返回将给定函数f应用到的流 此流的每个元素。这会返回一个惰性流 不需要完全实现。
因此,使用map
不评估流,它会生成一个新流。
答案 1 :(得分:2)
不要map
但是如果您追随println
的副作用,则会循环播放。
scala> var fList = Stream(new java.io.File("foo1") , new java.io.File("foo2"))
fList: scala.collection.immutable.Stream[java.io.File] = Stream(foo1, ?)
scala> fList.foreach(f => println(f.getAbsolutePath))
/tmp/foo1
/tmp/foo2
scala> fList take 2 foreach(f => println(f.getAbsolutePath))
/tmp/foo1
/tmp/foo2