1. ホーム
  2. scala

[解決済み] NotUsedとDoneの理解

2022-02-12 03:22:07

質問

の目的・意義が理解できず困っています。 NotUsedDone をAkka Streamsに追加しました。

次の2つの簡単な例を見てみましょう。

NotUsedを使用する。

implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()

val myStream: RunnableGraph[NotUsed] =
  Source.single("stackoverflow")
  .map(s => s.toUpperCase())
  .to(Sink.foreach(println))

val runResult:NotUsed = myStream.run()

Doneを使用する

implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()

val myStream: RunnableGraph[Future[Done]] =
  Source.single("stackoverflow")
  .map(s => s.toUpperCase())
  .toMat(Sink.foreach(println))(Keep.right)

val runResult: Future[Done] = myStream.run()

これらの例を実行すると、どちらの場合も同じ出力が得られます。

STACKOVERFLOW //output

では、NotUsedとDoneとはいったい何なのでしょうか?また、どのような場合にどちらを選ぶべきでしょうか?

解決するには?

まず、選択するのは NotUsedFuture[Done] (のみならず Done ).

さて、本来は マテリアライズドバリュー を使用することで、グラフを構成するさまざまなコンビネータ ( totoMatKeep.right ). マテリアライズドバリューは、ストリームの実行中に対話するための方法です。この選択は、ストリームで処理されるデータには影響を与えず、そのため、どちらの場合でも同じ出力が表示されます。同じ要素(文字列 "stackoverflow")が両方のストリームを通過しています。

この選択は、ストリームを実行した後、メインプログラムが何をすることになっているかによって決まります。

  • と対話することに興味がない場合。 NotUsed が正しい選択です。これは単なるダミーオブジェクトで、ストリームとの相互作用が許可されていない、あるいは必要ないという情報を伝達します
  • 他のアクションを実行するためにストリームの完了をリッスンする必要がある場合、そのために Future[Done] . こうすることで、(例えば)以下のようにコールバックをアタッチすることができます。 onComplete または map .