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 full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. 例えば・・・

    View full-size slide

  8. 簡潔な記述

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide


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

    View full-size slide

  14. 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 full-size slide

  15. 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 full-size slide

  16. 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 full-size slide

  17. 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 full-size slide

  18. 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 full-size slide

  19. 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 full-size slide

  20. 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 full-size slide

  21. 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 full-size slide

  22. 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 full-size slide

  23. $ 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 full-size slide


  24. 一番好き・・・////
    一番好き・・・////

    View full-size slide

  25. 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 full-size slide

  26. 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 full-size slide

  27. 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 full-size slide

  28. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

  31. 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 full-size slide

  32. 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 full-size slide

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

    View full-size slide

  34. セッション募集中!

    View full-size slide

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

    View full-size slide