2

我有:ox: Option[A]oxs: Option[List[A]]

我想:

  • ox.get :: oxs.get如果两者都存在则返回。

  • List(ox.get)如果ox存在且不存在则返回oxs

  • oxs.get如果oxs存在且不存在则返回ox

  • List()如果两者都是,则返回None

我可以用ifs 和matches. 我只是想知道是否有任何优雅的惯用方式来做到这一点?

编辑:我已经测试过:List(ox.map(List(_)), oxs).flatten.flatten它似乎适用于所有四种情况,但看起来仍然有点难以理解。

4

3 回答 3

7

尝试,

ox.toList ++ oxs.toList.flatten

如果你不介意结果是 aIterable[Int]而不是 aList[Int]你可以去掉首字母toList,

ox ++ oxs.toList.flatten
于 2013-05-26T09:10:14.647 回答
4
val oa: Option[A] = ???
val oas: Option[List[A]] = ???

val result = oa ++: oas.getOrElse( Nil ) // O(1).
val result2 = oa ++: oas.flatten // 2.9.x only. same result, less performance (O(N)).
val result3 = oa ++: oas.toList.flatten // 2.10.x. O(N).

FlattenList在重用初始列表result2时创建新的:result

val oa = Some(1)
val as = List(2,3)
val oas = Option(as)

val result = oa ++: oas.getOrElse( Nil )
// List(1, 2, 3)

val result2 = oa ++: oas.flatten
// List(1, 2, 3)

result.tail eq as // true - same object

result2.tail eq as // false - new object
于 2013-05-26T08:28:51.723 回答
2

您还可以使用 for 理解:

for (x <- ox; xs <- oxs) yield x :: xs

这只是一种更好的写作方式

ox.flatMap(x => oxs.map(xs => x :: xs))
于 2013-05-27T04:36:19.623 回答