業務でScalaを使うことが増えたので、自分用メモ。
順番とか一旦は無視で。参考とかにはならないと思う。
Optionクラス
OptionクラスにはSomeクラスとNoneクラスの子クラスを持つ。
val a1 = Some(null)
val a2 = Some("hoge")
val b = None
val c1 = Option(null)
val c2 = Option("huga")
c1.getOrElse("NULLyade")
a1: Some[Null] = Some(null)
a2: Some[String] = Some(hoge)
b: None.type = None
c1: Option[Null] = None
c2: Option[String] = Some(huga)
res0: String = NULLyade
a2にはSomeクラスに"hoge"が入ったものを入れている
bにはNoneクラスを入れている
c1にはOptionクラスにnullを入れたものが入ってる。 = Noneクラスが入っているのとほぼ同じになる
c2にはOptionクラスに"huga"を入れてる = Someクラスに"huga"が入っているのとほぼ同じになる
a1: Some[Null] = Some(null)
a1.get
res0: Null = null
a1.getOrElse
res1: String = null
val a2 = Some("hoge")
a2.get
res0: String = hoge
a2.getOrElse("NULLyade")
res1: String = hoge
get/getOrElseメソッドでSomeクラスから中身が取れる
val b = None
b.get
java.util.NoSuchElementException: None.get
at scala.None$.get(hoge.sc:345)
at scala.None$.get(hoge.sc:343)
at #worksheet#.#worksheet#(hoge.sc:13)
b.getOrElse("NULLyade")
res0: String = NULLyade
Noneクラスから中身を取ろうとしてもないのでエラーで落ちる
getOrElseを使えば()内の値が返るもしくは処理が実行される。
val c1 = Option(null)
c1.get
java.util.NoSuchElementException: None.get
at scala.None$.get(hoge.sc:345)
at scala.None$.get(hoge.sc:343)
at #worksheet#.#worksheet#(hoge.sc:14)
c1.getOrElse("NULLyade")
res0: String = NULLyade
Optionクラスにnull入れたものはNoneと同義なので、取得しようとしてもエラーで落ちる。
val c2 = Option("huga")
c2.get
res0: String = huga
c2.getOrElse("NULLyade")
res1: String = huga
Optionクラスに"huga"を入れたものはSomeクラスに"huga"を入れたものと同義なので普通に値が取れる。
getOrElseを使って値が取れない場合は・・・とかでエラー処理を書いたりできる。
Eitherクラス
ついエイサークラスと読んじゃう。イーサークラス。
EitherクラスはRightの値とLeftの値をもつ。
getやgetOrElseも使用可能。
val v1: Either[String, Int] = Right(123)
val v2: Either[String, Int] = Left("abc")
v1.fold (a => a, _ => 456)
v2.fold (a => a, _ => 456)
res2: Any = 456
res3: Any = abc
foldメソッドはRightの値が入ってたら右辺を
Leftの値が入ってたら左辺の処理を行う。
=>は必須。上の例だと、
v1はRightが入っているので右辺で 456 が返される。
v2はLeftが入っているので左辺の値で abc がそのまま返す。
これもエラーが発生したらLeftに入れるとかしてエラー処理に使える。
for式
val a = List(1,2,3)
for(e <- a) println(e)
1
2
3
foreach的な使い方。
リストaから1つ取得しeとして処理をする
これをリストに入っている分繰り返し実行する。
val a = List(1,2,3)
val fuga = for(e <- a) yield {
e + 1
}
fuga: List[Int] = List(2, 3, 4)
リストから1つずつ取得し、
yield{}内の処理を実行した上で新たなリストを作成しそのリストを"値"として返す。
yieldがつくと値を返す。
Option型のmap
val a1 = Option("bbb")
val a2 = a1.map{
case "aaaa" => "zzz"
case _ => Option(null)
}
a1: Option[String] = Some(bbb)
a2: Option[java.io.Serializable] = Some(None)
Option型のmapはOption型でラップされた値の中身を取り出す動きをする。
この時の返り値は値があろうがなかろうが、仮にNoneだったとしてもSomeクラスでラップされて返される。
val a1 = Option("bbb")
val a2 = a1.map{
case "aaaa" => "zzz"
case _ => Option(null)
}.getOrElse("nulldayo")
a1: Option[String] = Some(bbb)
a2: java.io.Serializable = None
そこにgetOrElseをつけることで返り値にラップされた値の中身を取り出すことができる。
1回のgetOrElseではもうNoneにはならないので、getOrElse()の()内の処理は実行されない。
val a1 = Option("bbb")
val a2 = a1.map{
case "aaaa" => Option("zzz")
case _ => Option(null)
}.get.getOrElse("NULLdayo")
a1: Option[String] = Some(bbb)
a2: String = NULLdayo
こうしてやるとできなくはない。
本当にただのメモ。