Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

omiend
November 10, 2018

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

omiend

November 10, 2018
Tweet

More Decks by omiend

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  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)

    View Slide

  4. 今日の昼に急いで作ったスライドなので
    もし間違った表現がありましたら
    @omiendまで

    View Slide

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

    View Slide

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

    View Slide

  7. 例えば・・・

    View Slide

  8. 簡潔な記述

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. for式

    View Slide

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

    View Slide


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

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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.

    View Slide

  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を使えば、あら不思議!
    これだけでいいんですね。

    View Slide


  25. 一番好き・・・////
    一番好き・・・////

    View Slide

  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型でも。

    View Slide

  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がかえります

    View Slide

  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.
    どうでしょう?

    View Slide

  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式かわいくないですか?

    View Slide

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

    View Slide

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

    View Slide

  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.

    View Slide

  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.

    View Slide

  34. 最後に!!!
    (実はコレが本題)

    View Slide

  35. View Slide

  36. セッション募集中!

    View Slide

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

    View Slide