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
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
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
670
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
130
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
340
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
530
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3k
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
190
霧の中の代数的エフェクト
funnyycat
1
430
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
9
15k
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
250
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
280
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
440
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
The Curious Case for Waylosing
cassininazir
1
440
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
エンジニアに許された特別な時間の終わり
watany
108
250k
Believing is Seeing
oripsolob
1
170
WENDY [Excerpt]
tessaabrams
11
39k
Statistics for Hackers
jakevdp
799
230k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
420
Marketing to machines
jonoalderson
1
5.6k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
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
セッション募集中!
ご清聴ありがとうございました