Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala合并选项序列_Scala_Scala Collections_Scala Option - Fatal编程技术网

scala合并选项序列

scala合并选项序列,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 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 REPL


那么一个简洁的理解方法呢:

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就足够了。感谢您澄清第二个案例的问题。