Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
820
Nuxt.js_Vue.js_のVuexの動かしかたをまとめてみたよ.pdf
omiend
0
120
20181208_好きだけじゃツライScala.js_共有版_.pdf
omiend
0
130
Other Decks in Programming
See All in Programming
Intent as Code
shoppingjaws
6
910
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
230
ソフトウェアラスタライザ
fadis
1
800
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
530
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
240
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
650
Building an Out-of-Order CPU
latte72
1
750
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
150
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1.1k
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
The Invisible Side of Design
smashingmag
301
52k
The SEO Collaboration Effect
kristinabergwall1
1
550
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
How to make the Groovebox
asonas
2
2.4k
What's in a price? How to price your products and services
michaelherold
247
13k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Believing is Seeing
oripsolob
1
210
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
330
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
セッション募集中!
ご清聴ありがとうございました