1

val A = Option(Seq(1,2))マージしval B = Option(Seq(3,4))て新しいオプション シーケンスを生成したい

val C = Option(Seq(1,2,3,4))

これ

val C = Option(A.getOrElse(Nil) ++ B.getOrElse(Nil))

よりも速く、より慣用的に見える

val C = Option(A.toList.flatten ++ B.toList.flatten)

しかし、より良い方法はありますか?getOrElseそして、より速くて軽いのは正しいtoList.flattenですか?

4

3 に答える 3

3

理解のためのきちんとしたものはどうですか:

val Empty = Some(Nil)

val C = for {
  a <- A orElse Empty
  b <- B orElse Empty
} yield a ++ b

より少ない中間オプションを作成します。

または、やや面倒なパターン マッチングを行うこともできます。

(A, B) match {
  case (None, None) => Nil
  case (None, sb@Some(b)) => sb
  case (sa@Some(a), None) => sa
  case (Some(a), Some(b)) => Some(a ++ b)
}

これにより、少なくとも二重フラット化よりも中間コレクションが少なくなると思います。

于 2016-09-26T20:10:30.713 に答える
1

使用するfoldLeft

Seq(Some(List(1, 2)), None).foldLeft(List.empty[Int])(_ ++ _.getOrElse(List.empty[Int]))
result: List[Int] = List(1, 2)

flatten2回使用

Seq(Some(Seq(1, 2, 3)), Some(4, 5, 6), None).flatten.flatten

result: Seq(1, 2, 3, 4, 5, 6)

スカラ REPL

scala> val a = Some(Seq(1, 2, 3))
a: Some[Seq[Int]] = Some(List(1, 2, 3))

scala> val b = Some(Seq(4, 5, 6))
b: Some[Seq[Int]] = Some(List(4, 5, 6))

scala> val c = None
c: None.type = None

scala> val d = Seq(a, b, c).flatten.flatten
d: Seq[Int] = List(1, 2, 3, 4, 5, 6)
于 2016-09-26T20:04:16.430 に答える