В настоящее время у меня есть следующий код:

val writer: PrintWriter = ???
val linesObservable: Observable[String] = ???

val future: CancelableFuture[Unit] = linesObservable.foreach(writer.write)

writer.close()

Моя цель - избавиться от всех побочных эффектов в приведенном выше фрагменте.

С функциональной точки зрения writer должен действовать как ресурс / скобка для future.

Поскольку я использую версию Monix 3.0.0-RC2, для Observable и Task доступны новые методы bracket (возможно, даже больше классов), которые могут быть тем, что я ищу - но я пока не совсем понимаю, как это сделать.

2
Markus Appel 25 Мар 2019 в 13:04

1 ответ

Лучший ответ

Да вы правы. Лучше получить PrintWriter как ресурс, чтобы его можно было аккуратно закрыть после завершения записи.

val writer: Resource[Task, PrintWriter] = 
  Resource.make[Task, PrintWriter](???)(pw => Task.delay(pw.close()))

val linesObservable: Observable[String] = ???

writer.use { pw =>
  linesObservable.foreachL(pw.write)
}
3
atl 16 Ноя 2019 в 07:03