Scala Akka (Actor)を使ってWordcountをするプログラムを考える(1)

Scala Akka (Actor)を使ってWordcountをするプログラムを考える

https://github.com/RuoAndo/qiita/tree/master/akka/Map/

まずは、アクターを使ってこのような変換をする。
Hello Scala World -> ListBuffer((Hello,1), (Scala,1), (World,1))

↓　扱うデータ

<pre>
    49object MapSample extends App {
    50  val system = ActorSystem()
    51
    52  val data = List("Hello World",
    53                  "Hello Scala World",
    54                  "Hello Java World",
    55                  "Hello Java Hello",
    56                  "Hello Scala Scala",
    57                  "Scala World World World",    
　　58                  "Scala World Scala World",
    59                  "Hello Groovy")
</pre>
https://github.com/RuoAndo/qiita/blob/master/akka/Map/MapSample.scala

まずは、Main関数からMainActorへデータを送る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163445/640e1ddc-4ab7-aff6-756e-09fb9377725e.png)

<pre>
    61  // アクターの生成
    62  val ref = system.actorOf(Props[MainActor], name = "mainActor")
    63  ref ! FirstMessage(data)
</pre>
https://github.com/RuoAndo/qiita/blob/master/akka/Map/MapSample.scala

ここでは、データをケースクラスに格納して送信している。

     9case class FirstMessage(prop1: List[String])

MainActorは、メッセージ（ケースクラスの）を受け取ると、map()を呼び出す。

    23  def receive = {
    24    case FirstMessage(prop1) => map(0, prop1)
    25    case _ => log.warning("unknown")
    26  }
    27
    28  def map(index: Int, data:List[String]) {
    29    data match {
    30      case Nil =>
    31      case x::xs => println("Main calls map():" + x)
    32                    MapRef ! x
    33                    map(index+1, xs)
    34    }
    35  }
https://github.com/RuoAndo/qiita/blob/master/akka/Map/MapSample.scala

↑は再帰呼び出しになっており、val data = List[]が空になるまでmap()が呼び出される。

MapActorはメッセージ("Hello World")を受け取ると、これを単語に分解して Key-value ("Hello,1"など)を作る

    18  def receive = {
    19    case s: String =>
    20            println("MapActor: %s".format(s))
    21            val words = new ListBuffer[(String, Int)]
    22            s.toString.split(' ').foreach(words += _->1)
    23            println("MapActor: List :" + words)
https://github.com/RuoAndo/qiita/blob/master/akka/Map/MapActor.scala

実行してみる。。。

Main calls map():Hello World
Main calls map():Hello Scala World
Main calls map():Hello Java World
MapActor: Hello World
Main calls map():Hello Java Hello
Main calls map():Hello Scala Scala
Main calls map():Scala World World World
MapActor: List :ListBuffer((Hello,1), (World,1))
Main calls map():Scala World Scala World
MapActor: Hello Scala World
Main calls map():Hello Groovy
MapActor: List :ListBuffer((Hello,1), (Scala,1), (World,1))
MapActor: Hello Java World
MapActor: List :ListBuffer((Hello,1), (Java,1), (World,1))
MapActor: Hello Java Hello
MapActor: List :ListBuffer((Hello,1), (Java,1), (Hello,1))
MapActor: Hello Scala Scala
MapActor: List :ListBuffer((Hello,1), (Scala,1), (Scala,1))
MapActor: Scala World World World
MapActor: List :ListBuffer((Scala,1), (World,1), (World,1), (World,1))
MapActor: Scala World Scala World
MapActor: List :ListBuffer((Scala,1), (World,1), (Scala,1), (World,1))
MapActor: Hello Groovy
MapActor: List :ListBuffer((Hello,1), (Groovy,1))

（｀ー´）b