Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20181110 Scala関西Summit 懇親会LT「Scalaのかわいいところ」
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
omiend
November 10, 2018
Programming
590
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20181110 Scala関西Summit 懇親会LT「Scalaのかわいいところ」
omiend
November 10, 2018
More Decks by omiend
See All by omiend
スクラッチ組織活用術 Salesforce Developers Meetup #24
omiend
0
1.4k
Nuxt.jsのComponent分割単位と,SSRをする上で気をつけること
omiend
1
810
Nuxt.js_Vue.js_のVuexの動かしかたをまとめてみたよ.pdf
omiend
0
120
20181208_好きだけじゃツライScala.js_共有版_.pdf
omiend
0
120
Other Decks in Programming
See All in Programming
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
560
Android CLI
fornewid
0
180
AIエージェントで 変わるAndroid開発環境
takahirom
2
720
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.2k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
240
共通化で考えるべきは、実装より公開する型だった
codeegg
0
280
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.5k
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
130
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.2k
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
200
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
380
Featured
See All Featured
The Curse of the Amulet
leimatthew05
2
13k
Crafting Experiences
bethany
1
230
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
610
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
510
A designer walks into a library…
pauljervisheath
211
24k
We Have a Design System, Now What?
morganepeng
55
8.2k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
660
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Site-Speed That Sticks
csswizardry
13
1.3k
Transcript
Scalaの好きなところ・・・//// 超超超初心者@omiend Scala関西Summit 2018 懇親会LT
Scalaのかわいいところ・・・//// 超超超初心者@omiend Scala関西Summit 2018 懇親会LT
@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)
今日の昼に急いで作ったスライドなので もし間違った表現がありましたら @omiendまで
最近Rubyばかり書いていますが 今日のみなさんの発表を見て やっぱりScalaって いいなと思いました
みなさんScalaはお好きですか? Scalaの何がお好きですか?
例えば・・・
簡潔な記述
少ない記述 バグの混在が減る!
強力な静的型付け言語
強力な静的型付け言語 かわいい!!
for式
for式 一番好き・・・//// 一番好き・・・////
一番好き・・・//// 一番好き・・・////
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.
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.
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.
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.
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.
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.
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.
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.
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.
$ 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を使えば、あら不思議! これだけでいいんですね。
一番好き・・・//// 一番好き・・・////
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型でも。
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がかえります
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. どうでしょう?
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式かわいくないですか?
あくまでも個人的な考えですが、プログラムの 頭が揃うと、それだけで見やすくなるものです。 更に、使われる変数も見やすくなるので flatMap/mapでネストしまくるくらいなら、積極的 にfor式で記述するべきだと考えてます。 もちろんときと場合によりますが・・・
あくまでも個人的な考えですが、プログラム の頭が揃うと、それだけで見やすくなるもの です。 更に、使われる変数も見やすくなるので flatMap/mapでネストしまくるくらいなら、積極 的にfor式で記述するべきだと考えていま す。 日本語だってそう。
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.
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.
最後に!!! (実はコレが本題)
None
セッション募集中!
ご清聴ありがとうございました