折叠/减少w /可能为空Seq且没有零值

时间:2013-08-01 12:07:05

标签: scala

例如,在Slick中,DDL对象可以组成:

val t1: DDL = Table1.ddl
val t2: DDL = Table2.ddl
val compositeDDL = t1 ++ t2

如果我有一系列DDL s,我想将它们缩减为DDL++

ddls.reduceLeft(_ ++ _)

如果序列为空,则不起作用。但是我也不能使用折叠,因为我可以使用没有的起始值(这样的值是否有意义?)。

ddls.foldLeft( wot? )(_ ++ _)

所以我诉诸于:

if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))

这是我能解决这个问题的最好方法吗?

2 个答案:

答案 0 :(得分:6)

您可以像这样使用reduceLeftOption

ddls.reduceLeftOption(_ ++ _)

它的工作原理如下:

if (ddls.isEmpty) None else Some(ddls.reduceLeft(_ ++ _))

您可以使用Seq实施几乎所有foldLeft方法。对于reduceLeftOption

ddls.foldLeft(None: Option[DDL]){ (a, e) => a.map{ _ ++ e }.orElse( Some(e) ) }

答案 1 :(得分:1)

使用reduceLeftOption获取Option包装结果:

 ddls.reduceLeftOption(_ ++ _)