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