[{"data":1,"prerenderedAt":1753},["ShallowReactive",2],{"Categories":3,"NavIndexCategoriesCountFooter":203,"content-\u002F2019\u002F05\u002F08\u002Fkafka-java-to-scala-akka-streams-basics\u002F":204},[4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,68,70,71,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202],{"category":5},"System Administration",{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":27},"Software Development",{"category":5},{"category":5},{"category":5},{"category":5},{"category":27},{"category":27},{"category":5},{"category":5},{"category":5},{"category":27},{"category":5},{"category":5},{"category":5},{"category":27},{"category":27},{"category":27},{"category":27},{"category":5},{"category":5},{"category":5},{"category":27},{"category":27},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":5},{"category":27},{"category":5},{"category":5},{"category":27},{"category":27},{"category":27},{"category":27},{"category":5},{"category":27},{"category":27},{"category":67},"Drones & RC",{"category":69},"DIY Projects",{"category":67},{"category":72},"Photography",{"category":69},{"category":69},{"category":69},{"category":67},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":69},{"category":67},{"category":69},{"category":69},{"category":67},{"category":67},{"category":72},{"category":72},{"category":72},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":5},{"category":5},{"category":72},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":5},{"category":67},{"category":67},{"category":72},{"category":72},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":67},{"category":72},{"category":67},{"category":138},"3D Printing - Laser Cutting - CNC",{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":138},{"category":5},{"category":138},{"category":27},{"category":27},{"category":138},{"category":138},{"category":72},{"category":158},"Photography,3D Printing - Laser Cutting - CNC",{"category":27},{"category":27},{"category":69},{"category":27},{"category":27},{"category":27},{"category":27},{"category":5},{"category":67},{"category":5},{"category":5},{"category":27},{"category":27},{"category":27},{"category":27},{"category":27},{"category":69},{"category":27},{"category":27},{"category":27},{"category":27},{"category":181},"Home Assistant",{"category":181},{"category":72},{"category":27},{"category":27},{"category":72},{"category":138},{"category":5},{"category":72},{"category":72},{"category":138},{"category":27},{"category":181},{"category":181},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},{"category":72},191,{"id":205,"title":206,"body":207,"category":27,"date":1738,"description":213,"embedImage":1739,"extension":1740,"image":1739,"intro":1741,"meta":1742,"navigation":513,"path":1744,"seo":1745,"series":1746,"sitemap":1747,"stem":1748,"tags":1749,"__hash__":1752},"content\u002F2019\u002F05\u002F08\u002Fkafka-java-to-scala-akka-streams-basics.md","Kafka - java to scala - akka streams basics",{"type":208,"value":209,"toc":1726},"minimark",[210,214,223,231,236,249,258,261,265,273,286,290,299,303,311,376,379,395,406,421,424,427,606,609,787,790,1121,1125,1128,1131,1169,1172,1228,1230,1438,1442,1445,1503,1508,1513,1553,1557,1589,1593,1619,1623,1691,1695,1706,1709,1713,1722],[211,212,213],"p",{},"This series goes through conversion of some basic java kafka clients to scala - step by step. It is important to understand that it is written from my viewpoint - someone who has played with scala, likes it, but has never really had time to get into it.",[211,215,216,217,222],{},"In the ",[218,219,221],"a",{"href":220},"\u002F2019\u002F05\u002F03\u002Fkafka-java-to-scala-scala-v2\u002F","previous post"," we updated our clients to use a configuration library and to make them somewhat more scala-like.",[211,224,225,226,230],{},"Moving forward - we will look at using them together with akka streams but before we can do that - we'll take a ",[227,228,229],"em",{},"very"," quick trip on akka streams in general.",[232,233,235],"h2",{"id":234},"brief-intro-to-akka-streams","Brief intro to akka streams",[211,237,238,239,248],{},"Akka itself has a large amount of information available on the ",[218,240,247],{"href":241,"rel":242,"target":246},"https:\u002F\u002Fdoc.akka.io",[243,244,245],"nofollow","noopener","noreferer","_blank","doc.akka.io"," site. This goes into much more detail and covers a much larger area than this post will - so do give it a read if you want more info.",[211,250,251,252,257],{},"I also found ",[218,253,256],{"href":254,"rel":255,"target":246},"https:\u002F\u002Fscalac.io\u002Fstreams-in-akka-scala-introduction\u002F",[243,244,245],"this article at scalac.io"," to be very informative.",[211,259,260],{},"Akka streams allows us to use the akka actor system to handle streaming data.",[232,262,264],{"id":263},"terminology","Terminology",[211,266,267,268,272],{},"This is very clearly explained on the article at ",[218,269,271],{"href":254,"rel":270,"target":246},[243,244,245],"scalac.io",":",[274,275,276,280,283],"ul",{},[277,278,279],"li",{},"Source - a source of data - one output",[277,281,282],{},"Flow - a transformation of data - one input, one output",[277,284,285],{},"Sink - a consumer of data - one input.",[232,287,289],{"id":288},"examples","Examples",[211,291,292,293,298],{},"Let's look briefly at two examples (both taken from the ",[218,294,297],{"href":295,"rel":296,"target":246},"https:\u002F\u002Fdoc.akka.io\u002Fdocs\u002Fakka\u002Fcurrent\u002Fstream\u002Fstream-quickstart.html",[243,244,245],"akka streams quickstart guide",")",[232,300,302],{"id":301},"akka-stream-example-1-just-an-int-stream","Akka stream example 1 - just an int stream",[211,304,305,306,310],{},"For our source - we'll just use a range of integers. Our source will only use the main output type so we'll mark it as ",[307,308,309],"code",{},"Int, NotUsed",".",[312,313,318],"pre",{"className":314,"code":315,"language":316,"meta":317,"style":317},"language-scala shiki shiki-themes github-dark","val source: Source[Int, NotUsed] = Source(1 to 100)\n","scala","",[307,319,320],{"__ignoreMap":317},[321,322,325,329,333,335,339,343,346,349,352,355,358,360,363,367,370,373],"span",{"class":323,"line":324},"line",1,[321,326,328],{"class":327},"snl16","val",[321,330,332],{"class":331},"s9osk"," source",[321,334,272],{"class":327},[321,336,338],{"class":337},"svObZ"," Source",[321,340,342],{"class":341},"s95oV","[",[321,344,345],{"class":337},"Int",[321,347,348],{"class":341},", ",[321,350,351],{"class":337},"NotUsed",[321,353,354],{"class":341},"] ",[321,356,357],{"class":327},"=",[321,359,338],{"class":337},[321,361,362],{"class":341},"(",[321,364,366],{"class":365},"sDLfK","1",[321,368,369],{"class":341}," to ",[321,371,372],{"class":365},"100",[321,374,375],{"class":341},")\n",[211,377,378],{},"Now we need to consume the source - let's just print each int.",[312,380,382],{"className":314,"code":381,"language":316,"meta":317,"style":317},"source.runForeach(i => println(i))\n",[307,383,384],{"__ignoreMap":317},[321,385,386,389,392],{"class":323,"line":324},[321,387,388],{"class":341},"source.runForeach(i ",[321,390,391],{"class":327},"=>",[321,393,394],{"class":341}," println(i))\n",[211,396,397,398,401,402,405],{},"Lastly - since this source has a finite amount of data - we can get the result of ",[307,399,400],{},"runForEach"," which is of type ",[307,403,404],{},"Future[Done]"," and hook up termination of the Actor system when the stream is completely consumed:",[312,407,409],{"className":314,"code":408,"language":316,"meta":317,"style":317}," done.onComplete(_ => system.terminate())\n",[307,410,411],{"__ignoreMap":317},[321,412,413,416,418],{"class":323,"line":324},[321,414,415],{"class":341}," done.onComplete(_ ",[321,417,391],{"class":327},[321,419,420],{"class":341}," system.terminate())\n",[211,422,423],{},"This code does expect a number of things to be implicitly available, the actor system, the materializer, and an execution context.",[211,425,426],{},"This gives the following object:",[312,428,430],{"className":314,"code":429,"language":316,"meta":317,"style":317},"object IntSeqExample extends App {\n    implicit val system = ActorSystem(\"IntSeqExample\")\n    implicit val materializer = ActorMaterializer()\n    implicit val ec = system.dispatcher\n\n    val source: Source[Int, NotUsed] = Source(1 to 100)\n\n    val done: Future[Done] = source.runForeach(i => println(i))\n\n    done.onComplete(_ => system.terminate())\n}\n",[307,431,432,449,475,493,508,515,551,556,585,590,600],{"__ignoreMap":317},[321,433,434,437,440,443,446],{"class":323,"line":324},[321,435,436],{"class":327},"object",[321,438,439],{"class":337}," IntSeqExample",[321,441,442],{"class":327}," extends",[321,444,445],{"class":337}," App",[321,447,448],{"class":341}," {\n",[321,450,452,455,458,461,464,467,469,473],{"class":323,"line":451},2,[321,453,454],{"class":327},"    implicit",[321,456,457],{"class":327}," val",[321,459,460],{"class":331}," system",[321,462,463],{"class":327}," =",[321,465,466],{"class":337}," ActorSystem",[321,468,362],{"class":341},[321,470,472],{"class":471},"sU2Wk","\"IntSeqExample\"",[321,474,375],{"class":341},[321,476,478,480,482,485,487,490],{"class":323,"line":477},3,[321,479,454],{"class":327},[321,481,457],{"class":327},[321,483,484],{"class":331}," materializer",[321,486,463],{"class":327},[321,488,489],{"class":337}," ActorMaterializer",[321,491,492],{"class":341},"()\n",[321,494,496,498,500,503,505],{"class":323,"line":495},4,[321,497,454],{"class":327},[321,499,457],{"class":327},[321,501,502],{"class":331}," ec",[321,504,463],{"class":327},[321,506,507],{"class":341}," system.dispatcher\n",[321,509,511],{"class":323,"line":510},5,[321,512,514],{"emptyLinePlaceholder":513},true,"\n",[321,516,518,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549],{"class":323,"line":517},6,[321,519,520],{"class":327},"    val",[321,522,332],{"class":331},[321,524,272],{"class":327},[321,526,338],{"class":337},[321,528,342],{"class":341},[321,530,345],{"class":337},[321,532,348],{"class":341},[321,534,351],{"class":337},[321,536,354],{"class":341},[321,538,357],{"class":327},[321,540,338],{"class":337},[321,542,362],{"class":341},[321,544,366],{"class":365},[321,546,369],{"class":341},[321,548,372],{"class":365},[321,550,375],{"class":341},[321,552,554],{"class":323,"line":553},7,[321,555,514],{"emptyLinePlaceholder":513},[321,557,559,561,564,566,569,571,574,576,578,581,583],{"class":323,"line":558},8,[321,560,520],{"class":327},[321,562,563],{"class":331}," done",[321,565,272],{"class":327},[321,567,568],{"class":337}," Future",[321,570,342],{"class":341},[321,572,573],{"class":337},"Done",[321,575,354],{"class":341},[321,577,357],{"class":327},[321,579,580],{"class":341}," source.runForeach(i ",[321,582,391],{"class":327},[321,584,394],{"class":341},[321,586,588],{"class":323,"line":587},9,[321,589,514],{"emptyLinePlaceholder":513},[321,591,593,596,598],{"class":323,"line":592},10,[321,594,595],{"class":341},"    done.onComplete(_ ",[321,597,391],{"class":327},[321,599,420],{"class":341},[321,601,603],{"class":323,"line":602},11,[321,604,605],{"class":341},"}\n",[211,607,608],{},"However - this code uses some nice shortcut methods that hide some of what is going on. Let's break it down so that we can see the source and the sink here.",[312,610,612],{"className":314,"code":611,"language":316,"meta":317,"style":317},"object IntSeqExample2 extends App {\n    implicit val system = ActorSystem(\"IntSeqExample2\")\n    implicit val materializer = ActorMaterializer()\n    implicit val ec = system.dispatcher\n\n    val source: Source[Int, NotUsed] = Source(1 to 100)\n\n    val sink: Sink[Int, Future[Done]] = Sink.foreach[Int](println)\n\n    val done = source.runWith(sink)\n\n    done.onComplete(_ => system.terminate())\n}\n",[307,613,614,627,646,660,672,676,710,714,754,758,769,773,782],{"__ignoreMap":317},[321,615,616,618,621,623,625],{"class":323,"line":324},[321,617,436],{"class":327},[321,619,620],{"class":337}," IntSeqExample2",[321,622,442],{"class":327},[321,624,445],{"class":337},[321,626,448],{"class":341},[321,628,629,631,633,635,637,639,641,644],{"class":323,"line":451},[321,630,454],{"class":327},[321,632,457],{"class":327},[321,634,460],{"class":331},[321,636,463],{"class":327},[321,638,466],{"class":337},[321,640,362],{"class":341},[321,642,643],{"class":471},"\"IntSeqExample2\"",[321,645,375],{"class":341},[321,647,648,650,652,654,656,658],{"class":323,"line":477},[321,649,454],{"class":327},[321,651,457],{"class":327},[321,653,484],{"class":331},[321,655,463],{"class":327},[321,657,489],{"class":337},[321,659,492],{"class":341},[321,661,662,664,666,668,670],{"class":323,"line":495},[321,663,454],{"class":327},[321,665,457],{"class":327},[321,667,502],{"class":331},[321,669,463],{"class":327},[321,671,507],{"class":341},[321,673,674],{"class":323,"line":510},[321,675,514],{"emptyLinePlaceholder":513},[321,677,678,680,682,684,686,688,690,692,694,696,698,700,702,704,706,708],{"class":323,"line":517},[321,679,520],{"class":327},[321,681,332],{"class":331},[321,683,272],{"class":327},[321,685,338],{"class":337},[321,687,342],{"class":341},[321,689,345],{"class":337},[321,691,348],{"class":341},[321,693,351],{"class":337},[321,695,354],{"class":341},[321,697,357],{"class":327},[321,699,338],{"class":337},[321,701,362],{"class":341},[321,703,366],{"class":365},[321,705,369],{"class":341},[321,707,372],{"class":365},[321,709,375],{"class":341},[321,711,712],{"class":323,"line":553},[321,713,514],{"emptyLinePlaceholder":513},[321,715,716,718,721,723,726,728,730,732,735,737,739,742,744,746,749,751],{"class":323,"line":558},[321,717,520],{"class":327},[321,719,720],{"class":331}," sink",[321,722,272],{"class":327},[321,724,725],{"class":337}," Sink",[321,727,342],{"class":341},[321,729,345],{"class":337},[321,731,348],{"class":341},[321,733,734],{"class":337},"Future",[321,736,342],{"class":341},[321,738,573],{"class":337},[321,740,741],{"class":341},"]] ",[321,743,357],{"class":327},[321,745,725],{"class":337},[321,747,748],{"class":341},".foreach[",[321,750,345],{"class":337},[321,752,753],{"class":341},"](println)\n",[321,755,756],{"class":323,"line":587},[321,757,514],{"emptyLinePlaceholder":513},[321,759,760,762,764,766],{"class":323,"line":592},[321,761,520],{"class":327},[321,763,563],{"class":331},[321,765,463],{"class":327},[321,767,768],{"class":341}," source.runWith(sink)\n",[321,770,771],{"class":323,"line":602},[321,772,514],{"emptyLinePlaceholder":513},[321,774,776,778,780],{"class":323,"line":775},12,[321,777,595],{"class":341},[321,779,391],{"class":327},[321,781,420],{"class":341},[321,783,785],{"class":323,"line":784},13,[321,786,605],{"class":341},[211,788,789],{},"We can add some flows too:",[312,791,793],{"className":314,"code":792,"language":316,"meta":317,"style":317},"object IntSeqExample3 extends App {\n  implicit val system = ActorSystem(\"IntSeqExample2\")\n  implicit val materializer = ActorMaterializer()\n\n  val evenFlow: Flow[Int, Int, NotUsed] = Flow[Int].filter(i => i % 2 == 0)\n  val toStringFlow: Flow[Int, String, NotUsed] = Flow[Int].map(i => i.toString)\n\n  val source: Source[Int, NotUsed] = Source(1 to 100)\n  val evenSource: Source[Int, NotUsed] = source.via(evenFlow)\n  val evenStringSource: Source[String, NotUsed] = evenSource.via(toStringFlow)\n\n  val sink: Sink[String, Future[Done]] = Sink.foreach[String](println)\n\n  val done = evenStringSource.runWith(sink)\n\n  implicit val ec = system.dispatcher\n  done.onComplete(_ => system.terminate())\n}\n",[307,794,795,808,827,841,845,902,944,948,982,1008,1034,1038,1072,1076,1088,1093,1106,1116],{"__ignoreMap":317},[321,796,797,799,802,804,806],{"class":323,"line":324},[321,798,436],{"class":327},[321,800,801],{"class":337}," IntSeqExample3",[321,803,442],{"class":327},[321,805,445],{"class":337},[321,807,448],{"class":341},[321,809,810,813,815,817,819,821,823,825],{"class":323,"line":451},[321,811,812],{"class":327},"  implicit",[321,814,457],{"class":327},[321,816,460],{"class":331},[321,818,463],{"class":327},[321,820,466],{"class":337},[321,822,362],{"class":341},[321,824,643],{"class":471},[321,826,375],{"class":341},[321,828,829,831,833,835,837,839],{"class":323,"line":477},[321,830,812],{"class":327},[321,832,457],{"class":327},[321,834,484],{"class":331},[321,836,463],{"class":327},[321,838,489],{"class":337},[321,840,492],{"class":341},[321,842,843],{"class":323,"line":495},[321,844,514],{"emptyLinePlaceholder":513},[321,846,847,850,853,855,858,860,862,864,866,868,870,872,874,876,878,880,883,885,888,891,894,897,900],{"class":323,"line":510},[321,848,849],{"class":327},"  val",[321,851,852],{"class":331}," evenFlow",[321,854,272],{"class":327},[321,856,857],{"class":337}," Flow",[321,859,342],{"class":341},[321,861,345],{"class":337},[321,863,348],{"class":341},[321,865,345],{"class":337},[321,867,348],{"class":341},[321,869,351],{"class":337},[321,871,354],{"class":341},[321,873,357],{"class":327},[321,875,857],{"class":337},[321,877,342],{"class":341},[321,879,345],{"class":337},[321,881,882],{"class":341},"].filter(i ",[321,884,391],{"class":327},[321,886,887],{"class":341}," i ",[321,889,890],{"class":327},"%",[321,892,893],{"class":365}," 2",[321,895,896],{"class":327}," ==",[321,898,899],{"class":365}," 0",[321,901,375],{"class":341},[321,903,904,906,909,911,913,915,917,919,922,924,926,928,930,932,934,936,939,941],{"class":323,"line":517},[321,905,849],{"class":327},[321,907,908],{"class":331}," toStringFlow",[321,910,272],{"class":327},[321,912,857],{"class":337},[321,914,342],{"class":341},[321,916,345],{"class":337},[321,918,348],{"class":341},[321,920,921],{"class":337},"String",[321,923,348],{"class":341},[321,925,351],{"class":337},[321,927,354],{"class":341},[321,929,357],{"class":327},[321,931,857],{"class":337},[321,933,342],{"class":341},[321,935,345],{"class":337},[321,937,938],{"class":341},"].map(i ",[321,940,391],{"class":327},[321,942,943],{"class":341}," i.toString)\n",[321,945,946],{"class":323,"line":553},[321,947,514],{"emptyLinePlaceholder":513},[321,949,950,952,954,956,958,960,962,964,966,968,970,972,974,976,978,980],{"class":323,"line":558},[321,951,849],{"class":327},[321,953,332],{"class":331},[321,955,272],{"class":327},[321,957,338],{"class":337},[321,959,342],{"class":341},[321,961,345],{"class":337},[321,963,348],{"class":341},[321,965,351],{"class":337},[321,967,354],{"class":341},[321,969,357],{"class":327},[321,971,338],{"class":337},[321,973,362],{"class":341},[321,975,366],{"class":365},[321,977,369],{"class":341},[321,979,372],{"class":365},[321,981,375],{"class":341},[321,983,984,986,989,991,993,995,997,999,1001,1003,1005],{"class":323,"line":587},[321,985,849],{"class":327},[321,987,988],{"class":331}," evenSource",[321,990,272],{"class":327},[321,992,338],{"class":337},[321,994,342],{"class":341},[321,996,345],{"class":337},[321,998,348],{"class":341},[321,1000,351],{"class":337},[321,1002,354],{"class":341},[321,1004,357],{"class":327},[321,1006,1007],{"class":341}," source.via(evenFlow)\n",[321,1009,1010,1012,1015,1017,1019,1021,1023,1025,1027,1029,1031],{"class":323,"line":592},[321,1011,849],{"class":327},[321,1013,1014],{"class":331}," evenStringSource",[321,1016,272],{"class":327},[321,1018,338],{"class":337},[321,1020,342],{"class":341},[321,1022,921],{"class":337},[321,1024,348],{"class":341},[321,1026,351],{"class":337},[321,1028,354],{"class":341},[321,1030,357],{"class":327},[321,1032,1033],{"class":341}," evenSource.via(toStringFlow)\n",[321,1035,1036],{"class":323,"line":602},[321,1037,514],{"emptyLinePlaceholder":513},[321,1039,1040,1042,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1064,1066,1068,1070],{"class":323,"line":775},[321,1041,849],{"class":327},[321,1043,720],{"class":331},[321,1045,272],{"class":327},[321,1047,725],{"class":337},[321,1049,342],{"class":341},[321,1051,921],{"class":337},[321,1053,348],{"class":341},[321,1055,734],{"class":337},[321,1057,342],{"class":341},[321,1059,573],{"class":337},[321,1061,741],{"class":341},[321,1063,357],{"class":327},[321,1065,725],{"class":337},[321,1067,748],{"class":341},[321,1069,921],{"class":337},[321,1071,753],{"class":341},[321,1073,1074],{"class":323,"line":784},[321,1075,514],{"emptyLinePlaceholder":513},[321,1077,1079,1081,1083,1085],{"class":323,"line":1078},14,[321,1080,849],{"class":327},[321,1082,563],{"class":331},[321,1084,463],{"class":327},[321,1086,1087],{"class":341}," evenStringSource.runWith(sink)\n",[321,1089,1091],{"class":323,"line":1090},15,[321,1092,514],{"emptyLinePlaceholder":513},[321,1094,1096,1098,1100,1102,1104],{"class":323,"line":1095},16,[321,1097,812],{"class":327},[321,1099,457],{"class":327},[321,1101,502],{"class":331},[321,1103,463],{"class":327},[321,1105,507],{"class":341},[321,1107,1109,1112,1114],{"class":323,"line":1108},17,[321,1110,1111],{"class":341},"  done.onComplete(_ ",[321,1113,391],{"class":327},[321,1115,420],{"class":341},[321,1117,1119],{"class":323,"line":1118},18,[321,1120,605],{"class":341},[232,1122,1124],{"id":1123},"akka-stream-example-2-factorials","Akka stream example 2 - factorials",[211,1126,1127],{},"This example starts with the exact same source (integer range).",[211,1129,1130],{},"It then operates over the stream - calculating an accumulated value:",[312,1132,1134],{"className":314,"code":1133,"language":316,"meta":317,"style":317},"val factorials = source.scan(BigInt(1))((acc, next) => acc * next)\n",[307,1135,1136],{"__ignoreMap":317},[321,1137,1138,1140,1143,1145,1148,1151,1153,1155,1158,1160,1163,1166],{"class":323,"line":324},[321,1139,328],{"class":327},[321,1141,1142],{"class":331}," factorials",[321,1144,463],{"class":327},[321,1146,1147],{"class":341}," source.scan(",[321,1149,1150],{"class":337},"BigInt",[321,1152,362],{"class":341},[321,1154,366],{"class":365},[321,1156,1157],{"class":341},"))((acc, next) ",[321,1159,391],{"class":327},[321,1161,1162],{"class":341}," acc ",[321,1164,1165],{"class":327},"*",[321,1167,1168],{"class":341}," next)\n",[211,1170,1171],{},"And then - we can consume it by zipping it together with a second source - to provide the list of factorials:",[312,1173,1175],{"className":314,"code":1174,"language":316,"meta":317,"style":317},"factorials\n      .zipWith(Source(0 to 100))((num, idx) => s\"$idx! = $num\")\n      .runForeach(println)\n",[307,1176,1177,1182,1223],{"__ignoreMap":317},[321,1178,1179],{"class":323,"line":324},[321,1180,1181],{"class":341},"factorials\n",[321,1183,1184,1187,1190,1192,1195,1197,1199,1202,1204,1207,1210,1213,1216,1219,1221],{"class":323,"line":451},[321,1185,1186],{"class":341},"      .zipWith(",[321,1188,1189],{"class":337},"Source",[321,1191,362],{"class":341},[321,1193,1194],{"class":365},"0",[321,1196,369],{"class":341},[321,1198,372],{"class":365},[321,1200,1201],{"class":341},"))((num, idx) ",[321,1203,391],{"class":327},[321,1205,1206],{"class":327}," s",[321,1208,1209],{"class":471},"\"",[321,1211,1212],{"class":341},"$idx",[321,1214,1215],{"class":471},"! = ",[321,1217,1218],{"class":341},"$num",[321,1220,1209],{"class":471},[321,1222,375],{"class":341},[321,1224,1225],{"class":323,"line":477},[321,1226,1227],{"class":341},"      .runForeach(println)\n",[211,1229,426],{},[312,1231,1233],{"className":314,"code":1232,"language":316,"meta":317,"style":317},"object FactorialExample extends App {\n    implicit val system = ActorSystem(\"FactorialExample\")\n    implicit val materializer = ActorMaterializer()\n    implicit val ec = system.dispatcher\n\n    val source: Source[Int, NotUsed] = Source(1 to 100)\n\n    val factorials = source.scan(BigInt(1))((acc, next) => acc * next)\n\n    val done: Future[Done] = factorials\n      .zipWith(Source(0 to 100))((num, idx) => s\"$idx! = $num\")\n      .runForeach(println)\n\n    done.onComplete(_ => system.terminate())\n}\n",[307,1234,1235,1248,1267,1281,1293,1297,1331,1335,1361,1365,1386,1418,1422,1426,1434],{"__ignoreMap":317},[321,1236,1237,1239,1242,1244,1246],{"class":323,"line":324},[321,1238,436],{"class":327},[321,1240,1241],{"class":337}," FactorialExample",[321,1243,442],{"class":327},[321,1245,445],{"class":337},[321,1247,448],{"class":341},[321,1249,1250,1252,1254,1256,1258,1260,1262,1265],{"class":323,"line":451},[321,1251,454],{"class":327},[321,1253,457],{"class":327},[321,1255,460],{"class":331},[321,1257,463],{"class":327},[321,1259,466],{"class":337},[321,1261,362],{"class":341},[321,1263,1264],{"class":471},"\"FactorialExample\"",[321,1266,375],{"class":341},[321,1268,1269,1271,1273,1275,1277,1279],{"class":323,"line":477},[321,1270,454],{"class":327},[321,1272,457],{"class":327},[321,1274,484],{"class":331},[321,1276,463],{"class":327},[321,1278,489],{"class":337},[321,1280,492],{"class":341},[321,1282,1283,1285,1287,1289,1291],{"class":323,"line":495},[321,1284,454],{"class":327},[321,1286,457],{"class":327},[321,1288,502],{"class":331},[321,1290,463],{"class":327},[321,1292,507],{"class":341},[321,1294,1295],{"class":323,"line":510},[321,1296,514],{"emptyLinePlaceholder":513},[321,1298,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329],{"class":323,"line":517},[321,1300,520],{"class":327},[321,1302,332],{"class":331},[321,1304,272],{"class":327},[321,1306,338],{"class":337},[321,1308,342],{"class":341},[321,1310,345],{"class":337},[321,1312,348],{"class":341},[321,1314,351],{"class":337},[321,1316,354],{"class":341},[321,1318,357],{"class":327},[321,1320,338],{"class":337},[321,1322,362],{"class":341},[321,1324,366],{"class":365},[321,1326,369],{"class":341},[321,1328,372],{"class":365},[321,1330,375],{"class":341},[321,1332,1333],{"class":323,"line":553},[321,1334,514],{"emptyLinePlaceholder":513},[321,1336,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359],{"class":323,"line":558},[321,1338,520],{"class":327},[321,1340,1142],{"class":331},[321,1342,463],{"class":327},[321,1344,1147],{"class":341},[321,1346,1150],{"class":337},[321,1348,362],{"class":341},[321,1350,366],{"class":365},[321,1352,1157],{"class":341},[321,1354,391],{"class":327},[321,1356,1162],{"class":341},[321,1358,1165],{"class":327},[321,1360,1168],{"class":341},[321,1362,1363],{"class":323,"line":587},[321,1364,514],{"emptyLinePlaceholder":513},[321,1366,1367,1369,1371,1373,1375,1377,1379,1381,1383],{"class":323,"line":592},[321,1368,520],{"class":327},[321,1370,563],{"class":331},[321,1372,272],{"class":327},[321,1374,568],{"class":337},[321,1376,342],{"class":341},[321,1378,573],{"class":337},[321,1380,354],{"class":341},[321,1382,357],{"class":327},[321,1384,1385],{"class":341}," factorials\n",[321,1387,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416],{"class":323,"line":602},[321,1389,1186],{"class":341},[321,1391,1189],{"class":337},[321,1393,362],{"class":341},[321,1395,1194],{"class":365},[321,1397,369],{"class":341},[321,1399,372],{"class":365},[321,1401,1201],{"class":341},[321,1403,391],{"class":327},[321,1405,1206],{"class":327},[321,1407,1209],{"class":471},[321,1409,1212],{"class":341},[321,1411,1215],{"class":471},[321,1413,1218],{"class":341},[321,1415,1209],{"class":471},[321,1417,375],{"class":341},[321,1419,1420],{"class":323,"line":775},[321,1421,1227],{"class":341},[321,1423,1424],{"class":323,"line":784},[321,1425,514],{"emptyLinePlaceholder":513},[321,1427,1428,1430,1432],{"class":323,"line":1078},[321,1429,595],{"class":341},[321,1431,391],{"class":327},[321,1433,420],{"class":341},[321,1435,1436],{"class":323,"line":1090},[321,1437,605],{"class":341},[232,1439,1441],{"id":1440},"compile-and-run","Compile and run",[211,1443,1444],{},"Start the sbt console, clean, compile and run each client:",[312,1446,1450],{"className":1447,"code":1448,"language":1449,"meta":317,"style":317},"language-shell shiki shiki-themes github-dark","$ sbt\n> clean\n> compile\n> runMain example.IntSeqExample\n> runMain example.IntSeqExample2\n> runMain example.IntSeqExample3\n> runMain example.FactorialExample\n","shell",[307,1451,1452,1460,1468,1475,1482,1489,1496],{"__ignoreMap":317},[321,1453,1454,1457],{"class":323,"line":324},[321,1455,1456],{"class":337},"$",[321,1458,1459],{"class":471}," sbt\n",[321,1461,1462,1465],{"class":323,"line":451},[321,1463,1464],{"class":327},">",[321,1466,1467],{"class":341}," clean\n",[321,1469,1470,1472],{"class":323,"line":477},[321,1471,1464],{"class":327},[321,1473,1474],{"class":341}," compile\n",[321,1476,1477,1479],{"class":323,"line":495},[321,1478,1464],{"class":327},[321,1480,1481],{"class":341}," runMain example.IntSeqExample\n",[321,1483,1484,1486],{"class":323,"line":510},[321,1485,1464],{"class":327},[321,1487,1488],{"class":341}," runMain example.IntSeqExample2\n",[321,1490,1491,1493],{"class":323,"line":517},[321,1492,1464],{"class":327},[321,1494,1495],{"class":341}," runMain example.IntSeqExample3\n",[321,1497,1498,1500],{"class":323,"line":553},[321,1499,1464],{"class":327},[321,1501,1502],{"class":341}," runMain example.FactorialExample\n",[1504,1505,1507],"h3",{"id":1506},"output","Output",[1509,1510,1512],"h4",{"id":1511},"integer-sequence","Integer sequence",[312,1514,1516],{"className":1447,"code":1515,"language":1449,"meta":317,"style":317},"1\n2\n3\n...\n98\n99\n100\n",[307,1517,1518,1523,1528,1533,1538,1543,1548],{"__ignoreMap":317},[321,1519,1520],{"class":323,"line":324},[321,1521,1522],{"class":337},"1\n",[321,1524,1525],{"class":323,"line":451},[321,1526,1527],{"class":337},"2\n",[321,1529,1530],{"class":323,"line":477},[321,1531,1532],{"class":337},"3\n",[321,1534,1535],{"class":323,"line":495},[321,1536,1537],{"class":365},"...\n",[321,1539,1540],{"class":323,"line":510},[321,1541,1542],{"class":337},"98\n",[321,1544,1545],{"class":323,"line":517},[321,1546,1547],{"class":337},"99\n",[321,1549,1550],{"class":323,"line":553},[321,1551,1552],{"class":337},"100\n",[1509,1554,1556],{"id":1555},"integer-sequence-2","Integer sequence 2",[312,1558,1559],{"className":1447,"code":1515,"language":1449,"meta":317,"style":317},[307,1560,1561,1565,1569,1573,1577,1581,1585],{"__ignoreMap":317},[321,1562,1563],{"class":323,"line":324},[321,1564,1522],{"class":337},[321,1566,1567],{"class":323,"line":451},[321,1568,1527],{"class":337},[321,1570,1571],{"class":323,"line":477},[321,1572,1532],{"class":337},[321,1574,1575],{"class":323,"line":495},[321,1576,1537],{"class":365},[321,1578,1579],{"class":323,"line":510},[321,1580,1542],{"class":337},[321,1582,1583],{"class":323,"line":517},[321,1584,1547],{"class":337},[321,1586,1587],{"class":323,"line":553},[321,1588,1552],{"class":337},[1509,1590,1592],{"id":1591},"integer-sequence-3","Integer sequence 3",[312,1594,1596],{"className":1447,"code":1595,"language":1449,"meta":317,"style":317},"2\n4\n...\n98\n100\n",[307,1597,1598,1602,1607,1611,1615],{"__ignoreMap":317},[321,1599,1600],{"class":323,"line":324},[321,1601,1527],{"class":337},[321,1603,1604],{"class":323,"line":451},[321,1605,1606],{"class":337},"4\n",[321,1608,1609],{"class":323,"line":477},[321,1610,1537],{"class":365},[321,1612,1613],{"class":323,"line":495},[321,1614,1542],{"class":337},[321,1616,1617],{"class":323,"line":510},[321,1618,1552],{"class":337},[1509,1620,1622],{"id":1621},"factorial","Factorial",[312,1624,1626],{"className":1447,"code":1625,"language":1449,"meta":317,"style":317},"0! = 1\n1! = 1\n2! = 2\n...\n98! = 9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000\n99! = 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000\n100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000\n",[307,1627,1628,1638,1647,1657,1661,1671,1681],{"__ignoreMap":317},[321,1629,1630,1633,1635],{"class":323,"line":324},[321,1631,1632],{"class":337},"0!",[321,1634,463],{"class":471},[321,1636,1637],{"class":365}," 1\n",[321,1639,1640,1643,1645],{"class":323,"line":451},[321,1641,1642],{"class":337},"1!",[321,1644,463],{"class":471},[321,1646,1637],{"class":365},[321,1648,1649,1652,1654],{"class":323,"line":477},[321,1650,1651],{"class":337},"2!",[321,1653,463],{"class":471},[321,1655,1656],{"class":365}," 2\n",[321,1658,1659],{"class":323,"line":495},[321,1660,1537],{"class":365},[321,1662,1663,1666,1668],{"class":323,"line":510},[321,1664,1665],{"class":337},"98!",[321,1667,463],{"class":471},[321,1669,1670],{"class":365}," 9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000\n",[321,1672,1673,1676,1678],{"class":323,"line":517},[321,1674,1675],{"class":337},"99!",[321,1677,463],{"class":471},[321,1679,1680],{"class":365}," 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000\n",[321,1682,1683,1686,1688],{"class":323,"line":553},[321,1684,1685],{"class":337},"100!",[321,1687,463],{"class":471},[321,1689,1690],{"class":365}," 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000\n",[232,1692,1694],{"id":1693},"summary","Summary",[211,1696,1697,1698,1702,1703,310],{},"This was an extremely brief look at akka-streams - taken mostly from the ",[218,1699,1701],{"href":295,"rel":1700,"target":246},[243,244,245],"akka streams quick start guide"," and from ",[218,1704,271],{"href":254,"rel":1705,"target":246},[243,244,245],[211,1707,1708],{},"Our next step will be to use akka streams for our producer and consumer clients.",[232,1710,1712],{"id":1711},"links","Links",[274,1714,1715],{},[277,1716,1717],{},[218,1718,1721],{"href":1719,"rel":1720,"target":246},"https:\u002F\u002Fgithub.com\u002Fchrissearle\u002Fkafka-java-to-scala\u002Ftree\u002Fmaster\u002Fakka-streams-basics",[243,244,245],"Streams project",[1723,1724,1725],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":317,"searchDepth":451,"depth":451,"links":1727},[1728,1729,1730,1731,1732,1733,1736,1737],{"id":234,"depth":451,"text":235},{"id":263,"depth":451,"text":264},{"id":288,"depth":451,"text":289},{"id":301,"depth":451,"text":302},{"id":1123,"depth":451,"text":1124},{"id":1440,"depth":451,"text":1441,"children":1734},[1735],{"id":1506,"depth":477,"text":1507},{"id":1693,"depth":451,"text":1694},{"id":1711,"depth":451,"text":1712},"2019-05-08 12:41 +0200",null,"md","In the previous post we updated our clients to use a configuration library and to make them somewhat more scala-like. Moving forward - we will look at using them together with akka streams but before we can do that - we'll take a very quick trip on akka streams in general.",{"updated":1743},"2020-01-23 00:00","\u002F2019\u002F05\u002F08\u002Fkafka-java-to-scala-akka-streams-basics",{"title":206,"description":213},"Kafka - java to scala",{"loc":1744},"2019\u002F05\u002F08\u002Fkafka-java-to-scala-akka-streams-basics",[316,1750,1751],"akka","akka streams","FAyXFo2hjs7qBqGLYjKG-idFBoSRe1sQnKgBeaSo6-I",1775293009078]