【问题标题】:Unable to map over a Stream of files无法映射文件流
【发布时间】:2023-04-01 01:45:01
【问题描述】:

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

 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((), ?)

Reading 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 上使用 map,是否应该评估流中包含的每个文件并因此输出其名称?

更新:我发现这很有用,是使用 Stream 的替代方法:Reading files from a directory in Scala

【问题讨论】:

    标签: scala


    【解决方案1】:

    根据Stream.map 文档:

    返回应用给定函数 f 产生的流 此流的每个元素。这将返回一个惰性流,这样它 不需要完全实现。

    所以使用map 不会评估流,它会生成一个新流。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-31
        • 2015-06-28
        • 2015-05-11
        • 2016-11-11
        • 1970-01-01
        • 2019-03-17
        • 2015-01-21
        相关资源
        最近更新 更多