Save 37% off PRO during our Black Friday Sale! »

20181110 Scala関西Summit 懇親会LT「Scalaのかわいいところ」

93f52b85c90d3fc6afdfa7c61ce2a89e?s=47 omiend
November 10, 2018

20181110 Scala関西Summit 懇親会LT「Scalaのかわいいところ」

93f52b85c90d3fc6afdfa7c61ce2a89e?s=128

omiend

November 10, 2018
Tweet

Transcript

  1. Scalaの好きなところ・・・//// 超超超初心者@omiend Scala関西Summit 2018 懇親会LT

  2. Scalaのかわいいところ・・・//// 超超超初心者@omiend Scala関西Summit 2018 懇親会LT

  3. @omiend 恵比寿で働くプログラマー歴12年目のおじさん 一応フロントエンドからバックエンドまで一通り出来ると思い込んでいる人間デス お仕事 - プログラミング - 会社経営 - 音楽雑誌のライター

    SI業界:8年 - Java,Shell,DB(SQLもゴリゴリ),Salesforce,GAE(Slim3) WEB業界:4年 - Scala(Play),Angular,React,Vue/Nuxt,Rails,Docker プライベート - Riot.js 好きなプログラム言語 - Scala(ScalaMatsuriのスタッフもやらさせていただいてます) 趣味 - 音楽 - 映画 - ジョギング・ウォーキング - DDD(Drink Driven Development)
  4. 今日の昼に急いで作ったスライドなので もし間違った表現がありましたら @omiendまで

  5. 最近Rubyばかり書いていますが 今日のみなさんの発表を見て やっぱりScalaって いいなと思いました

  6. みなさんScalaはお好きですか? Scalaの何がお好きですか?

  7. 例えば・・・

  8. 簡潔な記述

  9. 少ない記述 バグの混在が減る!

  10. 強力な静的型付け言語

  11. 強力な静的型付け言語 かわいい!!

  12. for式

  13. for式 一番好き・・・//// 一番好き・・・////

  14. 一番好き・・・//// 一番好き・・・////

  15. val list1: List[String] = List("TEST1","TEST2","TEST3") val list2: List[String] = List("TEST4","TEST5","TEST6")

    // TEST1 | TEST4 // TEST1 | TEST5 // TEST1 | TEST6 // TEST2 | TEST4 // TEST2 | TEST5 // TEST2 | TEST6 // TEST3 | TEST4 // TEST3 | TEST5 // TEST3 | TEST6 こんなふうにコンソールに出力したいばあい・・・ $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  16. val list1: List[String] = List("TEST1","TEST2","TEST3") val list2: List[String] = List("TEST4","TEST5","TEST6")

    for (l1 <- list1) { for (l2 <- list2) { println(s"$l1 | $l2") } } list1.foreach { l1 => list2.foreach { l2 => println(s"$l1 | $l2") } } Javaライクに書いたり foreachを使ったり $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  17. val list1: List[String] = List("TEST1","TEST2","TEST3") val list2: List[String] = List("TEST4","TEST5","TEST6")

    for { l1 <- list1 l2 <- list2 } println(s"$l1 | $l2") もしくは、for式を使うとこのようにかけます $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  18. val list1: List[String] = List("TEST1","TEST2","TEST3") val list2: List[String] = List("TEST4","TEST5","TEST6")

    List( "TEST1 | TEST4", "TEST1 | TEST5", "TEST1 | TEST6", "TEST2 | TEST4", "TEST2 | TEST5", "TEST2 | TEST6", "TEST3 | TEST4", "TEST3 | TEST5", "TEST3 | TEST6" ) 値を返したい場合どうでしょう? $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  19. val res = list1.map { l1 => list2.map { l2

    => s"$l1 | $l2" } } 値を返す=map?とまず考えるかもですが $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  20. List( List("TEST1 | TEST4", "TEST1 | TEST5", "TEST1 | TEST6"),

    List("TEST2 | TEST4", "TEST2 | TEST5", "TEST2 | TEST6"), List("TEST3 | TEST4", "TEST3 | TEST5", "TEST3 | TEST6") ) mapでネストしただけですと、こうなってしまいま すね $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  21. val res = list1.map { l1 => list2.map { l2

    => s"$l1 | $l2" } } そんなとき、外側のmapを $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  22. val res: List[String] = list1.flatMap { l1 => list2.map {

    l2 => s"$l1 | $l2" } } そんなとき、外側のflatMapにする、あるいは $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  23. val res: List[String] = list1.map { l1 => list2.map {

    l2 => s"$l1 | $l2" } }.flatten mapをネストする場合、おしりに flattenをつけてあ げます $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  24. $ scala -version Scala code runner version 2.12.6 -- Copyright

    2002-2018, LAMP/EPFL and Lightbend, Inc. val res = for { l1 <- list1 l2 <- list2 } yield s"$l1 | $l2" でも、mapを使えば、あら不思議! これだけでいいんですね。
  25. 一番好き・・・//// 一番好き・・・////

  26. val nameOpt1: Option[String] = Some("omiend1") val nameOpt2: Option[String] = Some("omiend2")

    val nameOpt3: Option[String] = Some("omiend3") val res = for { n1 <- nameOpt1 n2 <- nameOpt2 n3 <- nameOpt3 } yield s"$n1 | $n2 | $n3" // res: Option[String] = Some(omiend1 | omiend2 | omiend3) $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc. 値を返すfor式は、map/flatMapがあれば利用で きます。 例えば、Option型でも。
  27. val nameOpt1: Option[String] = Some("omiend1") val nameOpt2: Option[String] = None

    val nameOpt3: Option[String] = Some("omiend3") val res = for { n1 <- nameOpt1 n2 <- nameOpt2 n3 <- nameOpt3 } yield s"$n1 | $n2 | $n3" // res: Option[String] = None $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc. flatMapが動きますので、Noneがあるとその時点 で処理がおわり、Noneがかえります
  28. val res = for { n1 <- nameOpt1 n2 <-

    nameOpt2 n3 <- nameOpt3 } yield s"$n1 | $n2 | $n3" $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc. どうでしょう?
  29. val res = nameOpt1.flatMap { n1 => nameOpt2.flatMap { n2

    => nameOpt3.map { n3 => s"$n1 | $n2 | $n3" } } } $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc. 見比べると、for式かわいくないですか?
  30. あくまでも個人的な考えですが、プログラムの 頭が揃うと、それだけで見やすくなるものです。 更に、使われる変数も見やすくなるので flatMap/mapでネストしまくるくらいなら、積極的 にfor式で記述するべきだと考えてます。 もちろんときと場合によりますが・・・

  31. あくまでも個人的な考えですが、プログラム の頭が揃うと、それだけで見やすくなるもの です。 更に、使われる変数も見やすくなるので flatMap/mapでネストしまくるくらいなら、積極 的にfor式で記述するべきだと考えていま す。 日本語だってそう。

  32. val res = nameOpt1.flatMap { n1 => nameOpt2.flatMap { n2

    => nameOpt3.map { n3 => s"$n1 | $n2 | $n3" } } } $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  33. val res = for { n1 <- nameOpt1 n2 <-

    nameOpt2 n3 <- nameOpt3 } yield s"$n1 | $n2 | $n3" $ scala -version Scala code runner version 2.12.6 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
  34. 最後に!!! (実はコレが本題)

  35. None
  36. セッション募集中!

  37. ご清聴ありがとうございました