Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在保持引用透明性的同时高效地将JSON写入文件?_Scala_Functional Programming - Fatal编程技术网

Scala 如何在保持引用透明性的同时高效地将JSON写入文件?

Scala 如何在保持引用透明性的同时高效地将JSON写入文件?,scala,functional-programming,Scala,Functional Programming,我的主要目标是高效地将JSON行写入文件,同时保持引用的透明性。我有两个主要问题: 逐行写入文件是否有效?或者有没有更好的方法可以缓冲json并成批写入(我假设这比逐行写入要快) 如何在写入文件时保持引用的透明度?(据我所知,我需要将部分代码封装在IO Monad中,但我不确定这样做的正确方法是什么,也不确定如何安全地运行它)。欢迎进一步阅读 我已经创建了一些示例代码,以显示我在代码中所达到的目标(仅一个片段): import io.circe.generic.auto.\uIo.circe.s

我的主要目标是高效地将JSON行写入文件,同时保持引用的透明性。我有两个主要问题:

  • 逐行写入文件是否有效?或者有没有更好的方法可以缓冲json并成批写入(我假设这比逐行写入要快)
  • 如何在写入文件时保持引用的透明度?(据我所知,我需要将部分代码封装在IO Monad中,但我不确定这样做的正确方法是什么,也不确定如何安全地运行它)。欢迎进一步阅读
  • 我已经创建了一些示例代码,以显示我在代码中所达到的目标(仅一个片段):

    import io.circe.generic.auto.\uIo.circe.syntax_
    
    对于(u如果列表很大,您可以使用如下流:

    import cats.effect.{Blocker, ContextShift, IO, Sync}
    import fs2.Stream
    import io.circe.Encoder
    import io.circe.syntax._
    import java.nio.file.{Path, Paths}
    
    def writeToFileAsJsons[A : Encoder, F[_] : Sync : ContextShift](data: List[A], path: Path, blocker: Blocker): F[Unit] =
      Stream
      .emits(data)
      .covary[F]
      .map(_.asJson.noSpaces)
      .through(fs2.text.utf8Encode)
      .through(fs2.io.file.writeAll(path, blocker))
      .compile
      .drain
    
    并调用如下方法:

    val program: IO[Unit] =
      Blocker[IO].use { blocker =>
        writeToFileAsJsons[Int, IO](
          data = List(1, 2, 3),
          path = Paths.get("foo", "bar.txt"),
          blocker
        )
      }
    
    (只要作用域中的
    IO
    存在ContextShift



    如果列表真的很大,你可能希望从一开始就有一个,如果没有那么大,那就不要太担心了。

    期待着尝试一下这个方法!有没有更简单的方法(我觉得在某些情况下可能是一把大锤子敲小钉子)。有没有更简单的(天真的)方法对于这个实现来说,这更简单?@alt-f4是的,正如我所说的,如果列表很小,只需执行foreach并使用您喜欢的任何API将每个元素打印到文件中即可。
    val program: IO[Unit] =
      Blocker[IO].use { blocker =>
        writeToFileAsJsons[Int, IO](
          data = List(1, 2, 3),
          path = Paths.get("foo", "bar.txt"),
          blocker
        )
      }