scala合并选项序列
要合并val A=选项SEQ1,2和val B=选项SEQ3,4以生成新的选项序列吗 val C=选项SEQ1,2,3,4 这个 val C=OptionA.getOrElseNil++B.getOrElseNil 看起来比以前更快、更地道 val C=OptionA.toList.flatte++B.toList.flatte 但是有更好的办法吗?我说的对吗?getOrElse比toList更快更轻。扁平化?使用foldLeft 使用“展平”两次 Scala REPL 使用foldLeft 使用“展平”两次 Scala REPLscala合并选项序列,scala,scala-collections,scala-option,Scala,Scala Collections,Scala Option,要合并val A=选项SEQ1,2和val B=选项SEQ3,4以生成新的选项序列吗 val C=选项SEQ1,2,3,4 这个 val C=OptionA.getOrElseNil++B.getOrElseNil 看起来比以前更快、更地道 val C=OptionA.toList.flatte++B.toList.flatte 但是有更好的办法吗?我说的对吗?getOrElse比toList更快更轻。扁平化?使用foldLeft 使用“展平”两次 Scala REPL 使用foldLeft 使
那么一个简洁的理解方法呢:
val Empty = Some(Nil)
val C = for {
a <- A orElse Empty
b <- B orElse Empty
} yield a ++ b
我认为这至少比“双平面”创建的中间集合要少。一个简洁的理解方法怎么样:
val Empty = Some(Nil)
val C = for {
a <- A orElse Empty
b <- B orElse Empty
} yield a ++ b
我认为这至少比双展平创建的中间集合少。您的第一个案例:
// In this case getOrElse is not needed as the option is clearly not `None`.
// So, you can replace the following:
val C = Option(A.getOrElse(Nil) ++ B.getOrElse(Nil))
// By this:
val C = Option(A.get ++ B.get) // A simple concatenation of two sequences.
C: Option[Seq[Int]] = Some(List(1, 2, 3, 4))
由于多种原因,您的第二个案例/选项是错误的
val C = Option(A.toList.flatten ++ B.toList.flatten)
Option[List[Int]] = Some(List(1, 2, 3, 4))
它返回不正确的类型选项[List[Int]],而不是选项[Seq[Int]]
它不需要在A&B上调用toList。您可以简单地添加选项并在它们上调用Flatte
它不是干的,在A.toList和B.toList上都冗余地调用flatten,而在A++B上则可以调用flatten
相反,您可以更高效地执行此操作:
val E = Option((A ++ B).flatten.toSeq)
E: Option[Seq[Int]] = Some(List(1, 2, 3, 4))
您的第一个案例:
// In this case getOrElse is not needed as the option is clearly not `None`.
// So, you can replace the following:
val C = Option(A.getOrElse(Nil) ++ B.getOrElse(Nil))
// By this:
val C = Option(A.get ++ B.get) // A simple concatenation of two sequences.
C: Option[Seq[Int]] = Some(List(1, 2, 3, 4))
由于多种原因,您的第二个案例/选项是错误的
val C = Option(A.toList.flatten ++ B.toList.flatten)
Option[List[Int]] = Some(List(1, 2, 3, 4))
它返回不正确的类型选项[List[Int]],而不是选项[Seq[Int]]
它不需要在A&B上调用toList。您可以简单地添加选项并在它们上调用Flatte
它不是干的,在A.toList和B.toList上都冗余地调用flatten,而在A++B上则可以调用flatten
相反,您可以更高效地执行此操作:
val E = Option((A ++ B).flatten.toSeq)
E: Option[Seq[Int]] = Some(List(1, 2, 3, 4))
当你说更快时,你的意思是其他人对这段代码执行了基准测试吗?不大可能发生的但是,第一个示例不需要类型转换列表。与当前的任何答案相比,我更喜欢您的第一种方法。@BobDalgleish是的,我的感觉是第一个选项的转换更少,因此更可取。当您说更快时,您的意思是是否有其他人对此代码执行了基准测试?不大可能发生的但是,第一个示例不需要类型转换列表。与当前的任何答案相比,我更喜欢您的第一种方法。@BobDalgleish是的,我的感觉是第一个选项的转换更少,因此更可取。在我的情况下,该选项可能没有,所以我认为。get就足够了。谢谢你澄清了第二个案例的问题。在我的情况下,选项可能是无,所以我不认为。get就足够了。感谢您澄清第二个案例的问题。