无法映射文件流

时间:2014-04-15 14:54:34

标签: scala

我正在尝试映射文件流,但只评估第一个元素:

 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

的替代方法

2 个答案:

答案 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