LoginSignup
1
0

More than 5 years have passed since last update.

Scala初学者のメモ

Last updated at Posted at 2018-12-15

業務で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

こうしてやるとできなくはない。

本当にただのメモ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0